代码改变世界

cookie和session

2018-07-09 14:11  yelena  阅读(158)  评论(0编辑  收藏  举报

回话技术:帮助服务器记住客户端状态(区分客户端)

cookie:数据存储在客户端本地,减少服务器端的存储压力,安全性不好,客户端可以清楚cookie

session:数据存储在服务器端,安全性好,增加服务器压力

cookie(不能存储中文)

1、服务器端向客户端发送一个cookie

//1.创建cookie对象
        Cookie cookie = new Cookie("goods", "peanut");
        //设置cookie的持久化时间
        //cookie.setMaxAge(2*60);
        //设置cookie路径
        //cookie.setPath("/WEB05/demo/SendCookieServlet");
        cookie.setPath("/WEB05");
        //2.cookie
        response.addCookie(cookie);

删除cookie:设置一个同名同路径持久化时间为0的新cookie覆盖

//删除客户端保存的cookie
        Cookie cookie = new Cookie("goods", "peanut");
        cookie.setPath("/WEB05");
        cookie.setMaxAge(0);
        response.addCookie(cookie);

2、服务器端接收客户端携带的cookie

//获取客户端的cookie数据
        Cookie[] cookie = request.getCookies();
        //通过cookiename获取cookie值
        if(cookie!=null){
            for(Cookie c:cookie){
                String cookieName = c.getName();
                if(cookieName.equals("goods")){
                    System.out.println(c.getValue());
                }
            }
        }

cookie的实际使用

记录上一次登录时间

Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String lasttime = sdf.format(date);
        Cookie cookie = new Cookie("lasttime", lasttime);
        cookie.setMaxAge(10*60);
        response.addCookie(cookie);
        String lastaccesstime = null;
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for(Cookie c:cookies){
                String cookieName = c.getName();
                if(cookieName.equals("lasttime")){
                    lastaccesstime=c.getValue();
                    response.setContentType("text/html;charset=utf-8");
                    response.getWriter().write(lastaccesstime);
                }
            }
        }if(lastaccesstime==null){
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("第一次访问");
        }

session(也是一个域对象)

为每个客户端都创建一块内存空间 存储客户的数据,客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间

需要借助于Cookie存储客户的唯一性标识JSESSIONID

1、获取客户端的域对象

HttpSession session = request.getSession();

2、向session域中存数据

session.setAttribute("name", "王者荣耀");

持久化存储session

//获取JSESSIONID
        String id = session.getId();
        //手动创建一个cookie存储JSESSIONID
        Cookie cookie = new Cookie("JSESSIONID", id);
        cookie.setPath("/WEB05");
        cookie.setMaxAge(2*60);
        response.addCookie(cookie);
        response.getWriter().write(id);

获得session域中的内容

//获取session对象
        HttpSession session = request.getSession();
        String name =(String)session.getAttribute("name");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(name);

原理:关闭会话,session消失,指的是jsessionid消失,session还存在在服务器中,把jsessionid存储到cookie中,通过设置cookie的持久化时间,实现session的持久化使用

session的生命周期

1、创建:第一次执行request.getsession()时创建

2、销毁:服务器关闭、session过期/失效(默认30分钟-从不操作服务器端的资源开始)、手动销毁   invalidate()方法

session域的作用范围

默认一次会话中(一次会话中任何资源公用一个session对象)

session是把jsessionid存到cookie中,通过cookie中的id去找客户端的自己的session