一、Spring Session底层原理
昨天用Spring Session实现了用户分布式Session,那么为什么集成了springSession之后就可以把session存放在redis里面去?原理是什么?
(一) Spring Session底层原理
通过一个SessionRepositoryFilter将请求中原生的request、response以及HttpSession拦截,并做一个包装,重写内部获取session的逻辑,将getSession()做了一个重写。
那么此时Controller中获取到的session就是一个重写过逻辑的session了。
(二) 包装的过程:就是和redis整合:createSession这个接口--->首先将session存储到一个本地Map中,再将该Map信息存到redis中。
(三) Session的使用时间需要有所记录
通过redis的key设置一个过期时间,该时间体现在@EnableRedisHttpSession()设置的参数中。
(四)续签问题
在过期时间内(30分钟)再次请求登录,session过期时间刷新为30分钟,从头开始。
不过Redis中key的过期时间并不是是再每次的getAttribute的时候更新,为了减少与redis的交互。但是可以设置 。
(五)先取的是本地的session(存在一个Map中)还是redis中的呢?
首先说明的是:每一次请求到达不同的服务器上,第一次都必须从redis里面拉,并放在本地map中,剩下请求优先取的是本地缓存里的,本地map失效后再去取redis中,可以减少与redis请求次数,较少TPS。
二、JWT会话管理
(1) Jwt: JSON WEB TOKEN实现用户分布式登录
实现过程
以下信息参考:
1、用户登录输入登录信息,服务器验证是否正确(数据库中是否存在该用户信息)
2、通过Jwt工具类生成token,并将token存储再客户端,例如再local storage或cookie中
3、之后的HTTP请求之前都将token添加到Header中(Authorization:jwttoken)
4、服务器在执行Controller方法之前,需要对token信息进行验证(拦截器操作,getHeader(key)得到token信息),将token信息解码,如果当前令牌有效,则接受请求
5、一旦用户注销,令牌将在客户端被销毁,不需要与服务器进行交互一个关键是,令牌是无状态的。
后端服务器不需要保存令牌或当前session的记录。
(2)JWT的组成和与Session的区别以及优缺点