深入理解 cookie和session

为什么需要cookie和session?

  设想一下,一个网站如何才能记住你是否访问过呢?

  这里有两个解决方案:

  1.给你发一个带有网站logo会员卡,当你再次访问时网站会检查你是否持有印着网站logo的会员卡,从而得知你是否访问过

  2.记录你的会员id,并且将会员id印在会员卡上,下次访问时将会员卡上的id与网站记录过的id进行比对,查看是否存在相同id

  这里的解决方案1就是cookie,解决方案2为session

  做一个小Demo来演示,访问一个网站,如果是第一次访问本站则网站提醒用户这是第一次访问,否则给出上次的访问时间

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        //服务器从客户端获取cookie
        Cookie[] cookies = req.getCookies();
        //判断Cookie是否存在
        if(cookies!=null){
            //如果存在
            writer.write("你上一次访问的时间是:");
            for(int i=0;i<cookies.length;i++){
                if("lastLoginTime".equals(cookies[i].getName())){
                    //获取cookie中的值,注意解码
                    long lastLoginTime = Long.parseLong(
                            URLDecoder.decode(cookies[i].getValue(),"utf-8"));
                    Date date = new Date(lastLoginTime);
                    writer.write(date.toLocaleString());
                }
            }
        }else {
            writer.write("这是您第一次访问本站:");
        }
        //给客户端一个新的cookie,注意编码
        Cookie cookie = new Cookie("lastLoginTime", URLEncoder.encode(System.currentTimeMillis() + "","utf-8"));
        resp.addCookie(cookie);

    }

 

这是第一次访问网站时的页面,lastLoginName就是上文的会员卡logo

 

 当下次访问时服务器会对比cookie的名字是否是lastLoginName,是的话则给出上次访问时间

 

   cookie的本质其实是一个键值对,服务器每次对key进行比对,相等则记住用户,value可以保存用户的各种信息

保存在客户端,当访问时客户端即浏览器携带cookie发起Request请求

 

  session的原理和cookie差不多,不过session是保存在服务端,当访问第一次网站时,服务器记录用户一个id,这个id值保存在服务器端,起名为JSESSIONID,例如这里的FFXXX就是id值,同时给客户端一个cookie,cookie的key值为JSESSIONID,value值为FFXXX,下次访问是将JSESSIONID的值进行比对,相等则访问过本站,其实可以这样理解,session是客户端和服务端都保存一个相同的cookie。

//session创建的时候做了什么事
Cookie jsessionid = new Cookie("JSESSIONID", sessionId);
resp.addCookie(jsessionid);

 

 

 

 

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session =req.getSession();

        //给Session中存东西
        session.setAttribute("name",new Person("evolution",1));

        //获取Session的id
        String sessionId=session.getId();

        //判断Session是不是新创建
        if(session.isNew()){
            resp.getWriter().write("session创建成功,ID:"+sessionId);
        }else{
            resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId);
        }

session的value可以保存一个对象,比如一个用户的信息

 

cookie和session的对比:

1.如果没有设置setMaxAge,则cookie的生命周期当浏览器关闭的时候,就消亡了

2.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟,再次访问则重新计算

3.每个浏览器访问网站session都不同,而cookie可以供多个浏览器使用

4.一个网站可以发多个cookie给浏览器,最多20个,一个cookie只能保存一个信息

 

删除一个cookie,可以设置setMaxAge()时间为0

删除一个session,session.invalidate()

 

猜你喜欢

转载自www.cnblogs.com/hellomingsheng/p/12368886.html
今日推荐