说到session和cookie,想必大家都不会陌生,正巧前些天看了一些这方面的知识,所以结合自己的理解,整理记录一下,希望能对小伙伴有些帮助。
1.产生原因
在B/S架构中,通常是用http请求的形式来进行前后端(或者说客户端与服务端)的交互,但问题就来了,HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态(这也是其保持较快的响应速度的原因),所以当多个用户同时请求到服务器的时候,服务器到底应该怎么区分不同的用户呢。所以,能不能让用户请求服务器的时候,服务器给该用户一个独一无二的凭证,这样用户下次请求的时候每次都带上这个凭证(就好比每次都要输入密码),然后服务端根据凭证信息就可以知道是谁发起了请求,这样的话,就可以正确区分不同的用户了。基于这种思想,session和cookie就这样产生了。
2.是什么?
- session
基于上面的策略,客户端和服务端都应该需要存储凭证的地方,一个用于发送凭证,一个是收到凭证后在凭证库中查找并核对。所以,理所当然地应该分为两个部分。session就主要是在服务器端工作,服务器会为每个用户创建一个session并放在服务器中,这个session就叫会话。 - cookie
cookie自然就是在用户本地工作,是存在用户本地的电脑上的由一个个键值对构成的字符串,它可以持久存储。客户端每次发送请求,就会将cookie的值存放在请求头并发送给服务端。
3.session和cookie的联系
客户端第一次向服务端发送请求的时候,客户端的cookie为空,服务端接收到客户端发来的请求后,先查看cookie中有没有JSESSIONID这一项,如果没有,则认为是这个客户端对应的用户是第一次请求,所以会生成一个新的JSESSIONID来对应该用户,如下图的Response Headers中的Set-Cookie项,这代表着给前端返回JSESSIONID,从此之后该用户的请求就会带着这个JSESSIONID,凭此来证明自己的身份。可以看到之后发送的请求的Request Headers中的cookie都带有刚刚的JSESSIONID,而且是同一个,并且不会产生新的ID。
可以说,session的机制的实现必须要借助cookie这个载体,通过cookie承载session的id,达到sessionid从客户端到服务端的传递,从而实现了不同会话的跟踪(最近比较流行的token凭证也是相同的原理,比如jwt)。但反过来则不一样,cookie不需要依赖于session,它可以传递其它任何需要的键值对到服务端,服务端有专门的方法获取。
4.session安全规范
5.其它补充
- 后台给前端设置cookie的方法是response.setCookie(cookie),需要注意以下两个方法。
cookie.setMaxAge(); //若不设置该项,则每次关闭浏览器就清除cookie,和session的生命周期保持一致。
cookie.setPath(); //默认值是/,即项目域名根目录下,若设置为/demo ,则只有域名下/demo地址才能获取到该cookie
持
来源:CSDN
作者:布吉岛zzz
链接:https://blog.csdn.net/qq_37955930/article/details/103473907