java攻城狮程序员

Cookie的应用

2017-09-20  本文已影响36人  大炮对着虫子
什么是cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是各自用户自己的数据了
特点是会话数据保存在浏览器客户端

cookie常用api实例
 //1.创建Cookie对象
        Cookie cookie = new Cookie("name","eric");

        //2.设置Cookie参数
        //2.1.设置Cookie的有效路径
        cookie.setPath("/hello");//默认就是web项目的地址
        //2.2.设置Cookie的有效时间
        cookie.setMaxAge(20);//该cookie只存活20秒,从最后不调该cookie开始计算
        cookie.setMaxAge(-1);//该cookie保存在浏览器内存中,关闭浏览器则销毁该cookie
        cookie.setMaxAge(0);//删除根该cookie同名的cookie

        //3.把数据发送到浏览器
        response.addCookie(cookie);

        //4.服务端接收来自浏览器的cookie
        //方法1:
//        String name = request.getHeader("cookie");
//        System.out.println(name);
        //方法2:
        Cookie[] cookies = request.getCookies();
        //注意:判断null,否则空指针
        if(cookies!=null){
            //遍历
            for(Cookie c:cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+"="+value);
            }
        }else{
            System.out.println("没有接收cookie数据");
        }
上面代码原理

服务端创建 Cookie对象,将会话的数据存储在Cookie对象中,通过

response.addCookie(cookie);
其实是隐藏发送了一个set-cookie名称的响应头

发送到客户端。
下次客户端只要查询本地的cookie是否有对应的值,即可。

利用cookie显示上次登录时间
案例效果图

说明:当用户首次访问时,服务端创建cookie,设置有效期一个月,并将时间存储进去,发送cookie到客户端进行存储。当客户端下次访问时,查询cookie是否有值,有则显示时间。

jsp界面

<h3>这里是首页</h3>
    <p id="login_msg"></p>
    <script type="text/javascript">
     $.ajax(
    {
        type:"get",
        url:"CookiesServlet?type=gettime",
        dataType:"text",
        success:function(data)
        {
            $("#login_msg").text(data);
        }
        
        
    }       
    ); 
    
    </script>

servlet

protected void getTime(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
         response.setContentType("text/html;charset=utf-8");

            //获取当前时间
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
            String curTime = format.format(new Date());
           

            //取得cookie
            Cookie[] cookies = request.getCookies();
            String lastTime = null;
            
            //第n次访问
            if(cookies!=null){
                for (Cookie cookie : cookies) {
                    if(cookie.getName().equals("lastTime")){
                        //有lastTime的cookie,已经是第n次访问
                        lastTime = cookie.getValue();//上次访问的时间
                        //第n次访问
                        //1.把上次显示时间显示到浏览器
                        response.getWriter().print("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime);
                        //2.更新cookie
                        cookie.setValue(curTime);
                        //正整数:表示Cookie数据保存浏览器的缓存到硬盘中,数值表示保存的时间
                        //负整数:表示Cookie数据保存到浏览器的内存中,浏览器关闭Cookie就丢失了
                       // 零:表示删除同名的Cookie数据
                        cookie.setMaxAge(1*30*24*60*60);
                        //3.把更新后的cookie发送到浏览器
                        response.addCookie(cookie);
                        break;
                    }
                }
            }

            /**
             * 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)
             */
            if(cookies==null || lastTime==null){
                //1.显示当前时间到浏览器
                 //2.创建Cookie对象
                Cookie cookie = new Cookie("lastTime",curTime);
                cookie.setMaxAge(1*30*24*60*60);//保存一个月
                //3.把cookie发送到浏览器保存
                response.addCookie(cookie);
                response.getWriter().print("你是首次访问本网站,当前时间为:"+curTime);
               
            }
        }
    
Cookie实现自动登录

当我们登录后,服务器会创建一个session,一般这个session都有设置其有效时间。假设我们这里设置有效时间是2小时。如果我们登录后,

HttpSession session=request.getSession();
            session.setAttribute("user_name", username);

在登录拦截上:

if(session.getAttribute("user_name")==null){//说明没有登录,或者超时
            //异步
            if (req.getHeader("x-requested-with") != null&& req.getHeader("x-requested-with") .equalsIgnoreCase("XMLHttpRequest")) {
                resp.addHeader("sessionstatus", "timeOut");   //这个头是随意加的,键值对。
                resp.addHeader("loginPath", "login.jsp"); 
                return ;
            }
            else   //同步
            {
            
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out = resp.getWriter();
            out.println("<script language='javascript' type='text/javascript'>");
            out.println("alert('登录信息失效!请你重新登录!');window.parent.location.href='" + req.getContextPath() + "/login.jsp'");
            out.println("</script>");
            return; 
            }
        }
        
        chain.doFilter(request, response);

当我们登录后,在没有remove session的属性的情况下,session会话会存在服务器两个小时后才会失效。

那么问题来了,当我们关闭浏览器,再重新启动,进入主界面会被登录拦截掉,为什么呢?
正解:

服务器每创建一个session都会有一个相对应的sessionId,并且服务器会把这个sessionId,会以Cookie的形式回写给客户端(浏览器),下次同一个用户访问的时候会带这个sessionId属性。有时候就会出现一个问题,如果不小心关闭了客户端(浏览器),那么Cookie就不存在了。
例如常见的购物车功能,在购物的时候,不小心关闭了浏览器,该用户下次再来访问的时候,上次的记录就不存在了,所以当session创建的时候,可以把对应创建的sessionId存到一个设置有效期的的Cookie当中,那么在你关闭浏览器的时候,在较短时间内(session过期就失效),再次打开浏览器,上次的浏览记录依然还是在的。

下面演示自动登录的例子,即关闭浏览器后,只要session还没有过期,则无需在重新登录。

<session-config>
   <session-timeout>120</session-timeout>  
  </session-config>

登录成功,则

//存储session
            HttpSession session=request.getSession();
            session.setAttribute("user_name", username);
            
            Cookie cookie=new Cookie("userinfo", username+"-"+password);
            cookie.setMaxAge(60*60*2); //秒为单位 ,2小时
            response.addCookie(cookie);
            //将sessionid 持久化
            Cookie cookie2=new Cookie("JSESSIONID", session.getId());
            cookie2.setMaxAge(60*60*2); //秒为单位 ,2小时
            response.addCookie(cookie2);

当我们将sessionid持久化在cookie上,当我们下次访问时,客户端会通过cookies,得到sessionid,即找到了上次的session。

Cookie实现购物浏览记录功能

首页信息:一般显示商品全部信息:List<goods>底下有,最近浏览的商品信息。一般只存4-6个商品。
思路:利用cookies存商品的id和用户名,当点击商品详细信息时,把商品id更新在cookies上。

上一篇下一篇

猜你喜欢

热点阅读