Cookie和Session

  • 作用: 解决了不同请求之间的数据共享

简介

  • Cookie常设置在 HTTP 头信息中设置了一个Cookie信息,如

  • Cookie原理是什么?由于HTTP协议是一种无状态的协议,服务器单从网络连接上无法知道用户身份。如何解决?有客户端给每个请求发一个通行证,每人一个,谁访问都需要带上通行证,这样服务器就可以确认身份了。这就是Cookie的工作原理。

特点

  1. 浏览器端的数据存储技术
  2. 类型: 会话cookie和持久cookie(会话cookie:存储在浏览器的内存中,浏览器关闭即失效。持久cookie:设置了cookie的有效期,存储在客户端硬盘中,计算机重启也会存在。)
    3.默认的cookie信息存储好之后,每次请求都会附带,除非设置有效期。
    4.安全属性,设置Cookie的secure属性为true后,浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。
    5.cookie是不可跨域的

使用

        //创建Cookie对象
        //中文时这样设置,否则会出异常
        String encode1 = URLEncoder.encode("老三","utf-8");
        Cookie cookie = new Cookie("laosan",encode1);
        Cookie cookie1 = new Cookie("nn","chifanle1");

         //修改或者删除
         //修改,创建一个同名的Cookie对象,传到浏览器即可
         //删除,无法删除客户端的Cookie,但是可以设置这个cookie的有效期为0,即删除cookie

        //设置cookie有效期,设置负数表示是临时性cookie,浏览器关闭则失效,设置为0表示即时失效
        cookie.setMaxAge(300); //如300秒后过期,

        //域名
        //支持二级域名,如让qq.com下的wenxin.qq.com和music.qq.com都能使用的cookie可以设置域名
        cookie.setDomain(".qq.com");

        //路径
        //设置路径,只让 /test/cookie 路径访问
        cookie1.setPath("/test/cookie");

        //安全属性,设置为true只有在安全协议下才会传输,如(HTTPS,SSL)
        cookie1.setSecure(true);
       
        //响应cookie到客户端,必须的
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
  • 注: cookie值是中文会报HTTP Status 500 - Control character in cookie value or attribute.
//中文时这样设置,否则会出异常
//编码
String encode1 = URLEncoder.encode("老三","utf-8");
Cookie cookie = new Cookie("laosan",encode1);

//获取时解码这样做
for (Cookie cookie2: req.getCookies()){
          String value =  URLDecoder.decode(cookie2.getValue(),"UTF-8");
           System.out.println(cookie2.getName()+"===>"+value);
        }

Session

  • 作用:处理一个用户之间不同请求的数据共享

简介

  • Session是一种基于cookie的记录客户状态的机制,常翻译成"会话"。
  • 原理或者工作流程: 用户第一次访问服务器时,服务器会创建一个session对象给用户,并将该session对象的JSESSIONID使用cookie存储到浏览器中,在用户进行其他请求时将这个JSESSIONID传给服务器,这样就保证了用户的其他请求能够获取到同一个Session对象,也保证了不同请求能够获取到共享的数据。

特点

1.存储在服务器
2.服务器进行创建
3.依赖Cookie技术
4.默认存储时间是30分钟(在tomcat/conf/web.xml的session-timeout配置下设置
5.作用域是一次会话(从浏览器打开访问服务器到浏览器关闭

session失效场景

  1. session过期,默认30分钟,或者自定义设置的时间后失效
  2. 浏览器关闭,session没有过期,但是浏览器存储在cookie的JSESSIONID会被清除,所有请求服务器时会重新获取session
  3. 服务器重启

使用

        //创建session|获取session
        //如果请求中有sessionId就返回对应的session,没有则创建新的对象
        //如果session对象失效了,也会创建新的session对象
        HttpSession session = req.getSession();

        //获取SessionId
        String sessionId = session.getId();

        //设置session存储时间,秒,session对象会在有效期到达后失效
        session.setMaxInactiveInterval(300);

        //时间
        //获取创建时间,返回毫秒数,从1970.1.1日开始到现在的毫秒数
        long createTime = session.getCreationTime();
        //获取客户端最后一次与服务器接触的时间,从1970.1.1日开始到现在的毫秒数
        long lastAccesTime = session.getLastAccessedTime();
        //获取最大不活跃时间间隔
        long maxInactiveInterval = session.getMaxInactiveInterval();

        //数据操作
        session.setAttribute("laosi","老四");
        String name = (String)session.getAttribute("laosi");
        System.out.println(name);

        //设置session强制失效
        session.invalidate();

Session和cookie的比较

  1. cookie数据存储在客户端(浏览器),session存储在服务器上
  2. cookie没有session安全,别人可以解析本地存放cookie的文件
  3. session在一定时间内会保存到服务器上。当访问量增多,会比较占用服务器的性能,考虑减轻服务器的性能时,应使用cooKie.
posted @ 2021-02-04 14:56  阿肆啊  阅读(56)  评论(0编辑  收藏  举报