说到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安全规范
- 用户登录前后的session应该发生变化。代码示例
@GetMapping("/login")
public UserBean login(HttpServletRequest request, HttpServletResponse response){
//获取登录前session
HttpSession preSession=request.getSession();
//若session中带有参数,则先在这里获取并保存参数
//...
//然后销毁登录前的session
preSession.invalidate();
//登录操作
UserBean userInfo=doLogin();
//获取登录后的session
HttpSession afterSession=request.getSession(true);
//将刚才保存的参数在这里赋值给新的session
//...
return userInfo;
}
这是登录前的sessionid
这是登录后的sessionid
经处理可以看到两次的sessionid已经不一致了。相应的,用户退出登录,也应该改变sessionid,代码如下:
@GetMapping("/loginout")
public void logout(HttpServletRequest request){
HttpSession session=request.getSession(true);
if(session!=null){
//注销的时候注意销毁session
session.invalidate();
}
}
- session应该主动设置过期时间。
session.setMaxInactiveInterval()
5.其它补充
-
后台给前端设置cookie的方法是response.setCookie(cookie),需要注意以下两个方法。
cookie.setMaxAge(); //若不设置该项,则每次关闭浏览器就清除cookie,和session的生命周期保持一致。
cookie.setPath(); //默认值是/,即项目域名根目录下,若设置为/demo ,则只有域名下/demo地址才能获取到该cookie
持 -
cookie后面带有HttpOnly的意思是安全传输,只能在http传输过程中可以读取,用浏览器的方式无法读取到。