03 重定向,请求转发,cookie,session

重定向:

1/* 2 之前的写法 3 response.setStatus(302); 4 response.setHeader("Location", "login_success.html");*/ 5 6 //重定向写法: 重新定位方向 参数即跳转的位置 7 response.sendRedirect("login_success.html"); 8 9 1. 地址上显示的是最后的那个资源的路径地址 10 2. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。 11 3. 可以跳转到任意路径。 不是自己的工程也可以跳。 12 4. 效率稍微低一点, 执行两次请求。 13 5. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。

请求转发:

1//请求转发的写法: 参数即跳转的位置 2 request.getRequestDispatcher("login_success.html").forward(request, response); 3 1. 地址上显示的是请求servlet的地址。 返回200 ok 4 2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。 5 3. 只能跳转自己项目的资源路径 。 6 4. 效率上稍微高一点,因为只执行一次请求。 7 5. 可以使用上一次的request对象。

Cookie:
是服务器给客户端,并且存储在客户端上的一份小数据

应用场景:
自动登录、浏览记录、购物车。

为什么要有这个Cookie:
 http的请求是无状态。 客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录],其实从公司层面讲,就是为了更好的收集用户习惯[大数据]

添加Cookie给客户端

    1. 在响应的时候,添加cookie    
            Cookie cookie = new Cookie("aa", "bb");
            //给响应,添加一个cookie
            response.addCookie(cookie);

    2. 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie

获取客户端带过来的Cookie

1//获取客户端带过来的cookie 2 Cookie[] cookies = request.getCookies(); 3 if(cookies != null){ 4 for (Cookie c : cookies) { 5 String cookieName = c.getName(); 6 String cookieValue = c.getValue(); 7 System.out.println(cookieName + " = "+ cookieValue); 8 } 9 }

常用方法

1//关闭浏览器后,cookie就没有了。 ---> 针对没有设置cookie的有效期。 2 // expiry: 有效 以秒计算。 3 //正值 : 表示 在这个数字过后,cookie将会失效。 4 //负值: 关闭浏览器,那么cookie就失效, 默认值是 -1 5 cookie.setMaxAge(60 * 60 * 24 * 7); 6 7 //赋值新的值 8 //cookie.setValue(newValue); 9 10 //music.fly.com 11 //sport.fly.com 12 //用于指定只有请求了指定的域名,才会带上该cookie 13 cookie.setDomain(".fly.com"); 14 15 //只有访问该域名下的cookieDemo的这个路径地址才会带cookie 16 cookie.setPath("/CookieDemo");

例子一 :显示最近访问的时间

1response.setContentType("text/html;charset=UTF-8"); 2 String username = request.getParameter("username"); 3 String password = request.getParameter("password"); 4 if ("abc".equals(username)&&"123".equals(password)) { 5 Cookie[] cookies = request.getCookies(); 6 boolean firstLogin = true; 7 if (cookies!=null) { 8 for (Cookie cookie : cookies) { 9// System.out.println(cookie.getName()); 10// System.out.println(cookie.getValue()); 11 if (cookie.getName().equals("last-data")) { 12 firstLogin= false; 13 long lastData = Long.parseLong(cookie.getValue()); 14 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 15 String string = format.format(new Date(lastData)); 16 System.out.println("string"+string); 17 response.getWriter().write("欢迎:"+username+",上次登录"+string); 18 //重置登录时间 19 cookie.setValue(System.currentTimeMillis()+""); 20 response.addCookie(cookie); 21 } 22 } 23 } 24 //第一次登录 25 if (firstLogin) { 26 System.out.println("第一次登录"); 27 Cookie cookie = new Cookie("last-data", System.currentTimeMillis()+""); 28 cookie.setMaxAge(60*20); //20分钟 29 response.addCookie(cookie); 30 response.getWriter().write("欢迎:"+username); 31 } 32 }else { 33 response.getWriter().write("登录失败"); 34 }

Jsp 里面使用Java代码:
Java Server Pager ---> 最终会翻译成一个类, 就是一个Servlet

定义全局变量
    <%! int a = 99; %>
定义局部变量
    <% int b = 999; %>
在jsp页面上,显示 a 和 b的值
    <%=a %>
    <%=b %>

例子二:jsp显示浏览记录

1String goodsId = request.getParameter("id"); 2 Cookie[] cookies = request.getCookies(); 3 Cookie cookie = CookUtils.getCookie(cookies, "history"); 4 if (cookie==null) { 5 Cookie c = new Cookie("history", goodsId); 6 c.setMaxAge(60*60*24*7); 7 c.setPath("/CookiesDemo02"); //访问这个工程,才将cookie带过来 8 response.addCookie(c); 9 }else { 10 String value = cookie.getValue(); 11 cookie.setValue(value+"#"+goodsId); 12 cookie.setMaxAge(60*60*24*7); 13 cookie.setPath("/CookiesDemo02"); 14 response.addCookie(cookie); 15 } 16 //跳转 17 response.sendRedirect("product_info.htm"); 18 19jsp部分: 20 <% 21 Cookie[] cookies = request.getCookies(); 22 Cookie cookie = CookUtils.getCookie(cookies, "history"); 23 if(cookie == null){ 24 %> 25 <h2>您还没浏览任何商品</h2> 26 27 <% 28 }else{ 29 String [] id = cookie.getValue().split("#"); 30 for(String i : id){ 31 %> 32 <li style="width: 150px;height: 216;float: left;margin: 0 8px 0 0;padding: 0 18px 15px;text-align: center;"><img src="products/1/cs1000<%=i %>.jpg" width="130px" height="130px" /></li> 33 <% 34 } 35 } 36 37 %>

清除Cookie, 删除cookie是没有什么delete方法的。只有设置maxAge 为0 。

1     Cookie cookie = new Cookie("history",""); 2 cookie.setMaxAge(0); //设置立即删除 3 cookie.setPath("/CookieDemo02"); 4 response.addCookie(cookie);

Cookie总结

1. 服务器给客户端发送过来的一小份数据,并且存放在客户端上。
2. 获取cookie, 添加cookie
    request.getCookie();
    response.addCookie();
3. Cookie分类

    会话Cookie
        默认情况下,关闭了浏览器,那么cookie就会消失。

    持久Cookie

        在一定时间内,都有效,并且会保存在客户端上。
        cookie.setMaxAge(0); //设置立即删除
        cookie.setMaxAge(100); //100 秒

4. Cookie的安全问题。
由于Cookie会保存在客户端上,所以有安全隐患问题。  还有一个问题, Cookie的大小与个数有限制。

为了解决这个问题 ---> Session .

Session
会话 , Session是基于Cookie的一种会话机制。 Cookie是服务器返回一小份数据给客户端,并且存放在客户端上。 Session数据存放在服务器端。会在cookie里面添加一个字段 JSESSIONID . 是tomcat服务器生成。

常用API

        //得到会话ID
        String id = session.getId();
        //存值
        session.setAttribute(name, value);
        //取值
        session.getAttribute(name);
        //移除值
        session.removeAttribute(name);

Session何时创建  , 何时销毁?

创建:如果有在servlet里面调用了 request.getSession()

销毁:session 是存放在服务器的内存中的一份数据。 当然可以持久化. Redis . 即使关了浏览器,session也不会销毁。
1. 关闭服务器
2. session会话时间过期。 有效期过了,默认有效期: 30分钟。

例子三: 简单购物车

1response.setContentType("text/html;charset=utf-8"); 2 3 //1. 获取要添加到购物车的商品id 4 int id = Integer.parseInt(request.getParameter("id")); // 0 - 1- 2 -3 -4 5 String [] names = {"Iphone7","小米6","三星Note8","魅族7" , "华为9"}; 6 //取到id对应的商品名称 7 String name = names[id]; 8 9 //2. 获取购物车存放东西的session Map<String , Integer> iphoen7 3 10 //把一个map对象存放到session里面去,并且保证只存一次。 11 Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart"); 12 //session里面没有存放过任何东西。 13 if(map == null){ 14 map = new LinkedHashMap<String , Integer>(); 15 request.getSession().setAttribute("cart", map); 16 } 17 18 19 //3. 判断购物车里面有没有该商品 20 if(map.containsKey(name)){ 21 //在原来的值基础上 + 1 22 map.put(name, map.get(name) + 1 ); 23 }else{ 24 //没有购买过该商品,当前数量为1 。 25 map.put(name, 1); 26 } 27 28 //4. 输出界面。(跳转) 29 response.getWriter().write("<a href='product_list.jsp'><h3>继续购物</h3></a><br>"); 30 response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>"); 31 32<% 33Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart"); 34if(map!=null){ 35 for(String key:map.keySet()){ 36 int value = map.get(key); 37 %> 38 <h3>名称:<%=key %> 数量:<%=value %></h3> 39 <% 40 } 41} 42 43 44%>

移除Session中的元素

        //强制干掉会话,里面存放的任何数据就都没有了。
        session.invalidate();
        
        //从session中移除某一个数据
        //session.removeAttribute("cart");

为什么再一次开启浏览器访问的时候,无法取到以前的数据。

因为sessionid是通过cookie来传递的。 但是这个cookie并没有设置有效期。 所以关闭浏览器之后, cookie就删除了。
表明里面的那个sessionID 也就没有了。下一次再来访问。 如果还想在下一次访问的时候,取到以前的数据。

在服务器端手动设置cookie

        String id = request.getSession().getId();
        Cookie cookie = new Cookie("JSESSIONID",id);
        cookie.setMaxAge(60*60*24*7);//7天
        reponse.addCookie(cookie);

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )