1 Cookie机制(k-v机制)

1.1 概念

  • Cookie 是服务器通知客户端保存键值对的一种技术。
  • 客户端有了 Cookie 后,每次请求都发送给服务器。
  • 每个 Cookie 的大小不能超过 4kb

    1.2 Cookie的创建&读取&更新&清除

    ```java //1.0 SpringBoot演示创建Cookie @RequestMapping(“/setCookie”) @ResponseBody public Student handle01(HttpServletResponse response) { Cookie cookie = new Cookie(“name”, “fly”); / 扩展:setMaxAge()可以管理Cookie什么时候被销毁。 正数:表示在指定的秒数后过期:设置了时间后,浏览器将会把cookie保存在本地,关闭了浏览器下次打开 也可以查看到(除非浏览器设置了关闭时清除所有Cookie的选项) 负数:表示浏览器一关,Cookie 就会被删除(默认值是-1,代表浏览器一关cookie就丢失) 零:表示马上删除 Cookie(可用于退出登录等) / cookie.setMaxAge(60 * 60); response.addCookie(cookie); return new Student(); }

//2.0 SpringBoot演示取出Cookie @RequestMapping(“/getCookie”) @ResponseBody public Object handle02(HttpServletRequest request) { String value = “”; Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if (“name”.equals(cookie.getName())) {//比较不可直接使用== value = cookie.getValue(); break; } } return value; }

//3.0 Cookie值的修改 /*

  • 更新Cookie
  • */ @RequestMapping(“/updateCookie”) public void updateCookie(HttpServletRequest request, HttpServletResponse response) { //方式一:创建要修改的同名的Cookie对象(同名指的是Cookie对象的Key相同)并response Cookie cookieNew = new Cookie(“name”, “flyUpdate”); response.addCookie(cookieNew);

    //方式二:从Cookie[]中找到原来的Cookie对象,并设置值 Cookie[] cookies = request.getCookies(); Cookie cookieOld = null; for (Cookie ck : cookies) {

    1. if ("name".equals(ck.getName())) {//比较不可直接使用==
    2. cookieOld = ck;
    3. break;
    4. }

    } if (cookieOld != null) {

    1. cookieOld.setValue("flyUpdate2");
    2. response.addCookie(cookieOld);

    } }

/* 4.0 退出登录销毁cookie功能

  • */ @RequestMapping(“/logout”) public void removeCookie(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); Cookie cookie = null; for (Cookie ck : cookies) {
    1. if ("name".equals(ck.getName())) {//比较不可直接使用==
    2. cookie = ck;
    3. break;
    4. }
    } //最后记得要Response if (cookie != null) {
    1. cookie.setMaxAge(0);
    2. response.addCookie(cookie);
    } }

/5 Path设置 Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。path 属性是通过请求的地址来进行有效的过滤。 / protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { Cookie cookie = new Cookie(“path1”, “path1”); //getContextPath() ===>>>> 得到工程路径 cookie.setPath( req.getContextPath() + “/abc” ); // ===>>>> / 工程路径 /abc resp.addCookie(cookie); resp.getWriter().write(“ 创建了一个带有 Path 路径的 Cookie”); }

/*6.0 关于setMaxAge()不同值 零:表示马上删除 Cookie(可用于退出登录等) 正数:表示在指定的秒数后过期(值将保存在浏览器内存,关闭后再打开还在,除非浏览器设置了手动清除了) 负数:表示浏览器一关,Cookie 就会被删除(默认值是-1,代表浏览器一关cookie就丢失) / 正常值:cookie.setMaxAge(600) Set-Cookie: name=fly; Max-Age=600; Expires=Thu, 02-Sep-2021 06:37:03 GMT;

退出登录时:setMaxAge(0): Set-Cookie: name=fly; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT

负值(默认不设置时值即-1):setMaxAge(-1) Set-Cookie: name=fly

  1. > 创值
  2. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/696107/1630550098501-cadd5e6d-a7d9-425d-a0bf-1422ad7009b0.png#clientId=u67c2cf72-337a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=413&id=euLTN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=413&originWidth=1081&originalType=binary&ratio=1&rotation=0&showTitle=false&size=263106&status=done&style=none&taskId=u879bd75b-3a92-46ad-a097-833f2abf945&title=&width=1081)
  3. > 取值
  4. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/696107/1630550397915-ea7d3b6b-d262-4805-aba2-0bb5b40d835c.png#clientId=u67c2cf72-337a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=357&id=XC8c3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=357&originWidth=1089&originalType=binary&ratio=1&rotation=0&showTitle=false&size=173517&status=done&style=none&taskId=u3ea09863-3156-4f58-9bf2-2b632adf59c&title=&width=1089)
  5. <a name="mz8Z3"></a>
  6. # 2 Session机制(k-vk-v机制)
  7. <a name="FYas5"></a>
  8. ## 2.1 概念与双KV机制
  9. > **概念**
  10. ```java
  11. 1.Session 就一个接口(HttpSession)。
  12. 2.Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
  13. 3.每个客户端都有自己的一个 Session 会话。
  14. 4.Session 会话中,我们经常用来保存用户登录之后的信息。

建立在Cookie机制上的KV机制:JSessionID-JSessionIDValue

Session传输是建立在Cookie机制上的。使用Session时,框架会自动生成一个Key为JSESSIONID,Value为字符串的Cookie对象,并自动Response.add(cookie)->set-cookie到浏览器。

Session池的KV机制

框架会以上面传输到浏览器的Cookie对象的Value值作为Key(即JSessionIDValue值),new 出来的Session对象作为Value,将这样的K-V数据存入系统的Session池里,每个Session内部是以ConcurrentMap<String, Object> attributes存储信息的。

2.2 Session的使用(存取&清除&过期时间)

Session具体值是存在服务器的,传给浏览器的是cookie的k-v值(所谓的双K-V机制)。
当在后台使用Session时:session.setAttribute("loginId", "CoCo=" + UUID.randomUUID());
浏览器Response的设置如下:Set-Cookie: JSESSIONID=YmZiM2YwZWQtYTc0ZC00N2E5LWI0YjItZDkwMzA3MjFlNmUz; Path=/; HttpOnly;
可得知没有为该JSESSIONID值设置setMaxAge,故就是默认的-1值,即关闭浏览器后会自动清除该cookie值,所以下次关闭了浏览器,该cookie值丢失,状态就无法传递到服务器,服务器的Session就获取不到,等到服务器本身的setMaxInactiveInterval时间到了,则该Session对象在服务器内存(或Redis)里面就会丢失。
理论上可以将Session对应的Cookie值拿到并当做Cookie对象操作。

  1. //1.0 往Session里面存入数据
  2. @RequestMapping("/setSession")
  3. @ResponseBody
  4. public Student handle01(HttpSession session) {
  5. session.setAttribute("loginId", "CoCo=" + UUID.randomUUID());
  6. /*setMaxInactiveInterval():设置 Session 的超时时间(以秒为单位)。此Session指的是服务器的Session对象的超时时间,超过指定时间,Session就会被销毁。
  7. 值为正数的时候,设定Session的超时时长。负数表示永不超时(极少使用)
  8. */
  9. session.setMaxInactiveInterval(600);
  10. return new Student();
  11. }
  12. //2.0 从Session里面取数据
  13. @RequestMapping("/getSession")
  14. @ResponseBody
  15. public Object handle02(HttpSession session) {
  16. Object loginId = session.getAttribute("loginId");
  17. return loginId;
  18. }
  19. //3.0 清除Session对象:
  20. //让当前Session会话马上超时无效
  21. @RequestMapping("/clearSession")
  22. public void clearSession(HttpSession session, HttpServletRequest request) {
  23. session.invalidate();
  24. }
  25. //4.0 设置Session对象存活时间:setMaxInactiveInterval()
  26. /*设置Session对象的存活时间(以秒为单位)。
  27. 注意:此Session指的是服务器的Session对象的存活时间。超过指定时间,Session就会被销毁。
  28. Session 默认的超时时间长为 30 分钟。
  29. 值为正数的时候,设定Session的超时时长。
  30. 负数表示永不超时(极少使用)
  31. */
  32. session.setMaxInactiveInterval(600);

3 Session和Cookie的技术关联

image.png