• 一文理解Cookie、Session


    一文理解Cookie、Session

    1、什么是会话

    用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话;

    HTTP 是无状态,有会话的

    HTTP 是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在**同一个网站中进行连续的交互**,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

    2、Cookie

    简单来说:是服务器发送到浏览器,并保存在浏览器端的一小块数据。

    当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样, web 资源处理的就是用户各自的数据了。

    cookie工作流程

    image-20221028232946301

    示例代码:

    基于SpringBoot构建测试环境:

    @RestController
    @RequestMapping("/alpha")
    @Slf4j
    public class AlphaController {
        /**
         * cookie示例
         */
        @RequestMapping("/cookie/set")
        public String setCookie(HttpServletResponse response) {
            // 创建实例
            Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
            // 过期时间
            cookie.setMaxAge(60 * 10);
            // cookie的生效范围 也就是在访问什么资源的情况下需要携带此cookie
            cookie.setPath("/community/alpha");
            response.addCookie(cookie);
            return "set cookie ok!!!";
        }
    
        /**
         * 获取cookie
         */
        @GetMapping("/cookie/get")
        public String getCookie(@CookieValue("code") String code) {
            log.warn("【获取cookie】 code = {} ", code);
            return "get cookie ok!!!";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    启动项目,浏览器访问

    image-20221028232033810

    cookie属性项:

    属性项属性项介绍
    NAME=VALUE键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
    Path当访问哪个路径时,携带此token
    Expires过期时间,在设置的某个时间点后该 Cookie 就会失效
    Domain生成该 Cookie 的域名,如 domain=“www.baidu.com
    Secure如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

    3、Session

    session,存储在我们的服务端,下图是session工作流程图。

    • 也就是说,服务器只返回对应的sessionId给浏览器

    image-20221028232935524

    示例代码:

    基于SpringBoot构建测试环境

     /**
         * session示例
         */
        @RequestMapping("/session/set")
        public String setCookie(HttpSession session) {
            session.setAttribute("code", "0000");
            return "set cookie ok!!!";
        }
    
        /**
         * 获取session
         */
        @GetMapping("/session/get")
        public String getCookie(HttpSession session) {
            log.warn("【获取cookie】 code = {} ", session.getAttribute("code"));
            return "get cookie ok!!!";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    启动项目,浏览器访问

    image-20221028233446385

    可以看到,服务器只返回sessionID

    4、两者区别

    1. cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
    2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
    3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
    4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
  • 相关阅读:
    Sigma 规则如何帮助解决网络安全技能短缺问题
    Java.lang.Class类 getProtectionDomain()方法有什么功能呢?
    多路转接与Reactor
    【无标题】行操作DataFrame
    Python入门学习13(面向对象)
    内核中的RCU锁
    【运维自动化-配置平台】如何通过模板创建集群和模块
    华为机试真题 C++ 实现【最大括号深度】
    三维模型3DTile格式轻量化顶点压缩主要技术方法分析
    mysql统计整个数据库记录条数
  • 原文地址:https://blog.csdn.net/qq_50975965/article/details/127584720