10

一文理解Cookie、Session - look-word

 1 year ago
source link: https://www.cnblogs.com/look-word/p/16838330.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一文理解Cookie、Session

1、什么是会话

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

HTTP 是无状态,有会话的

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

2、Cookie

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

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

cookie工作流程

2233272-20221028232952282-556828341.png

示例代码:

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

启动项目,浏览器访问

2233272-20221028232045709-795645319.png

cookie属性项:

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

3、Session

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

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

2233272-20221028232938521-2117088155.png

示例代码:

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

启动项目,浏览器访问

2233272-20221028233448014-984090548.png

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

4、两者区别

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

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK