@EnableSpringHttpSession原理笔记
分布式集群Session共享问题解决方案-@EnableRedisHttpSession
使用redis数据库存储session代替本地存储session
@EnableRedisHttpSession
- 使用存储本地服务器的方式和使用存储Redis数据库的方式 都需要支持
HttpSessionEvent HttpSessionEvent主要包含三个事件- 创建事件
- 过期事件
(过期用户自动登出) - 销毁事件
- 使用本地存储的时候,可以使用设置监听的方式,监听事件的发生,从而做出相应的处理
- 使用
Redis存储的时候,需要使用的KeySpce Notification键空间通知
![在这里插入图片描述]()
Spring Session原理示意图
![在这里插入图片描述]()
Spring session在数据库中的存储形式

spring session 在redis数据库中会存在三个key如上图所示:exprations、sessions、expires
Redis + Spring session数据结构及作用

Redis触发过期事件的方式
redis 需要触发过期事件,才能向spring服务端发送键空间通知
redis session的最大的延迟事件是1分钟
- 客户端访问的时候发现key过期
- redis在一定事件间隔频率在后台逐步查找过期键
如果仅用上述两个redis自带的机制无法保证key的过期事件抵达后立即生成过期事件。
通过添加key的方式实现及时过期session的需求![在这里插入图片描述]()
exprations里存的是 这一分钟里的所有的key,是set结构的
@EnableRedisHttpSession 设置默认的过期事件是30分钟
@RedisHttpSessionConfiguration 设置web服务没分钟的0秒去redis请求该分钟内的过期的key
SpringHttpSessionConfiguration 定义了SessionRepositoryFilter
SessionRepositoryFilter里进行了Request 和 Response的包装

getSession的时候先从Reques里尝试 获取,如果没有将创建新Session
response对象commit()的时候将session信息保存到redis数据库
EnableRedisHttpSession 中有一个onMessage(),可以接收Redis的键空间通知,接收到通知后发送Session过期Event事件。




浙公网安备 33010602011771号