本文写下session持久化和分布式共享 基于shiro框架对session的管理机制来实现
一直处于登陆状态:你登陆微信 不可能三天两头就让你重新登陆吧?而是一直处于登陆状态 除非主动退出微信
session共享 对于分布式系统 一个用户的多次请求到不同的机器上 不可能每次请求都生成一个session 彼此没有联系吧? 而是希望一个用户登陆一次就有一个session 每次请求都会使用这一个session的信息
shiro中的sessionDao接口就是用来进行持久化和缓存处理的
分布式session有什么用。shiro中的session相关类继承关系
sessionDAO接口有一个抽象子类 AbstractSessionDAO
抽象子类AbstractSessionDAO有2个实现类 CachingSessionDAO(用于缓存处理)、MemorySessionDAO(用于内存管理)
CachingSessionDAO有一个子类EnterpriseCacheSessionDAO
分布式session如何设计。CachingSessionDAO有一个接口 CacheManagerAware
sessionDAO
AbstractSessionDAO
分布式session、
CachingSessionDAO
先看下 CacheManager接口的实现
分布式session会话,
继续回到 CachingSessionDAO
分布式session框架、
session redis。更新session
删除session
MemorySessionDAO
这里面也是类似的方法 基于ConcurrentHashMap的增删改查
spring session、EnterpriseCacheSessionDAO
这里面也是类似的方法 基于ConcurrentHashMap的增删改查
源码看到这里的小小感受
1、shiro对session的保存都是基于内存 通过ConcrrentHashMap集合进行存储
2、如果想通过数据库、缓存或文件存储的话 需要自己实现 而实现的方式也很简单 就是
需要实现增删改查的几个方法即可
1、继承CacheManager 实现getCache的方法
2、实现Cache接口 实现基于redis的增删改查
3、将存储redis的实现换成存储数据库就变成了session持久化到数据库的方式
下面介绍另外一个redis的实现方法(对redis的封装比较好 推荐使用) 包括redis集群模式、单机模式
shiro分布式session?
该接口有4个实现类
单机缓存的增删改查
缓存集群模式的增删改查
RedisSentinelManager
集群模式
单机模式
以上说的几个类 都是对与redis的操作 还未和shiro的session管理机制交互 下面咱说说怎么与shiro交互的刚才也说了 想要基于shiro来实现持久化存储 只需要:第一种方式1、继承CacheManager 实现getCache的方法
2、实现Cache接口 实现基于redis的增删改查
3、将 CacheManager 设置到 DefaultWebSecurityManager 第二种方式1、在sessionDAO的实现类中直接 存储到redis中
2、将sessionDAO 设置到 DefaultWebSessionManager
先看第一种方式
RedisCacheManager 类
顾命思意 缓存的管理者 那么这个类中保存了很多的缓存
实现CacheManager接口
先看下内存ConcurrentHashMap中是否存在该缓存 如果不存在则定义该缓存然后放入Map中 ;下面来看下 如何定义的缓存
RedisCache 类
实现了 Cache 接口通过IRedisManager接口对缓存进行增删改查操作
再看下第二种方式
RedisSessionDAO
继承AbstractSessionDAO 抽象类
这里面也是通过 IRedisManager接口对缓存进行增删改查操作
内存存储对象为ThreadLocal本质上还是一个Map集合具体内容就不再重复分析了 朋友们可以下载源码看下即可
https://gitee.com/pingfanrenbiji/spring-boot-2.0.3/tree/master/spring-boot-shirohttps://gitee.com/pingfanrenbiji/shiro-redis.git
本文使用 mdnice 排版
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态