• 一文详解Cookie 和 Session 会话技术


    目录

    Cookie

     Session

    分布式下Seesion的不足


    Cookie

    定义:Cookie是服务器发送到浏览器,并保存在浏览器端的一小块数据。浏览器下次访问该服务器时,会自动携带该数据块,将其发送给服务器。

    作用:由于HTTP是无状态的,在同一次连接中,两个执行成功的请求之间是没有关系的,这就带来了问题,用户没办法在同一个网站进行连续的交互。会话技术就是可以解决这个问题,将一次连接中多个请求连接在一起

    具体代码实现 

    1. // cookie示例
    2. @RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
    3. @ResponseBody
    4. public String setCookie(HttpServletResponse response) {
    5. // 创建cookie
    6. Cookie cookie = new Cookie("code", CommunityUtil.getUUID());
    7. // 设置cookie生效的范围
    8. cookie.setPath("/community/alpha");
    9. // 设置cookie的生存时间
    10. cookie.setMaxAge(60 * 10);
    11. // 发送cookie
    12. response.addCookie(cookie);
    13. return "set cookie";
    14. }
    15. @RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
    16. @ResponseBody
    17. public String getCookie(@CookieValue("code") String code) {
    18. System.out.println(code);
    19. return "get cookie";
    20. }

    【验证】第一步,服务器成功cookie,从responseHeaders中可以看出,已经生成cookie

    【第二步】在RequestHeader中携带了cookie信息 

     

     Session

    是JaveEE的标准,用于在服务器端记录客户端的信息数据存放在服务端更加安全,但也会增加服务端的内存。

    • 浏览器访问服务器时,服务器会生成一个Session信息。
    • 服务器产生一个Cookie将SessionId存入Cookie返回浏览器。
    • 浏览器再次访问时候带着cookie就可以了

    1. // session示例
    2. @RequestMapping(path = "/session/set", method = RequestMethod.GET)
    3. @ResponseBody
    4. public String setSession(HttpSession session) {
    5. session.setAttribute("id", 1);
    6. session.setAttribute("name", "Test");
    7. return "set session";
    8. }
    9. @RequestMapping(path = "/session/get", method = RequestMethod.GET)
    10. @ResponseBody
    11. public String getSession(HttpSession session) {
    12. System.out.println(session.getAttribute("id"));
    13. System.out.println(session.getAttribute("name"));
    14. return "get session";
    15. }

    【验证】创建session

    利用Cookie访问Session 

    分布式下Seesion的不足

    • 假设,我们用户A来了访问nginx做负载均衡,首先被分配到了服务器1,服务器1存入session。
    • 第二次我用户A又来了,然后分配到了服务器3,服务器3又存入Session。这就造成了。
    • 服务器端的压力,重复存入Session。

    解决方案:利用Redis+token来缓存。解决用户状态记录的问题

     

  • 相关阅读:
    docker学习总结
    机器学习|模型评估——AUC
    35. 【Java教程】注解
    让reviewdog支持gitlab-push-commit,守住代码质量下限
    kubebuilder(3)实现operator
    滴滴秋招提前批正式开始,现在投递免笔试
    Ubuntu18.04平台下Qt开发程序打包的一些问题总结
    LED屏显示模块的组成及工作原理介绍
    「Verilog学习笔记」使用3-8译码器①实现逻辑函数
    SpringBoot整合Kafka (一)
  • 原文地址:https://blog.csdn.net/abc123mma/article/details/127910125