一文理解Cookie、Session

1、什么是会话

HTTP 是无状态,有会话的

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

2、Cookie

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

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

cookie工作流程

一文理解Cookie、Session-LMLPHP

示例代码:

基于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!!!";
    }
}

启动项目,浏览器访问

一文理解Cookie、Session-LMLPHP

cookie属性项:

3、Session

一文理解Cookie、Session-LMLPHP

示例代码:

基于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!!!";
    }

启动项目,浏览器访问

一文理解Cookie、Session-LMLPHP

4、两者区别

  1. cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
10-29 11:22