0
点赞
收藏
分享

微信扫一扫

基于shiro实现session持久化和分布式共享

前言

本文写下session持久化和分布式共享 基于shiro框架对session的管理机制来实现

必要性

  • 一直处于登陆状态:你登陆微信 不可能三天两头就让你重新登陆吧?而是一直处于登陆状态 除非主动退出微信
  • session共享 对于分布式系统 一个用户的多次请求到不同的机器上 不可能每次请求都生成一个session 彼此没有联系吧?而是希望一个用户登陆一次就有一个session 每次请求都会使用这一个session的信息

shiro对session的管理机制

shiro中的sessionDao接口就是用来进行持久化和缓存处理的

基于shiro实现session持久化和分布式共享_增删改查shiro中的session相关类继承关系

  • sessionDAO接口有一个抽象子类 AbstractSessionDAO
  • 抽象子类AbstractSessionDAO有2个实现类 CachingSessionDAO(用于缓存处理)、MemorySessionDAO(用于内存管理)
  • CachingSessionDAO有一个子类EnterpriseCacheSessionDAO
  • CachingSessionDAO有一个接口 CacheManagerAware

下面分别介绍下每一个接口或类中的内容

sessionDAO

基于shiro实现session持久化和分布式共享_redis_02

AbstractSessionDAO

基于shiro实现session持久化和分布式共享_redis_03基于shiro实现session持久化和分布式共享_增删改查_04

CachingSessionDAO

基于shiro实现session持久化和分布式共享_redis_05

先看下 CacheManager接口的实现

基于shiro实现session持久化和分布式共享_缓存_06基于shiro实现session持久化和分布式共享_redis_07基于shiro实现session持久化和分布式共享_缓存_08

继续回到 CachingSessionDAO

基于shiro实现session持久化和分布式共享_缓存_09基于shiro实现session持久化和分布式共享_redis_10基于shiro实现session持久化和分布式共享_缓存_11基于shiro实现session持久化和分布式共享_缓存_12基于shiro实现session持久化和分布式共享_增删改查_13更新session基于shiro实现session持久化和分布式共享_缓存_14删除session

MemorySessionDAO

这里面也是类似的方法 基于ConcurrentHashMap的增删改查

EnterpriseCacheSessionDAO

这里面也是类似的方法 基于ConcurrentHashMap的增删改查

源码看到这里的小小感受

1、shiro对session的保存都是基于内存 通过ConcrrentHashMap集合进行存储
2、如果想通过数据库、缓存或文件存储的话 需要自己实现 而实现的方式也很简单 就是
需要实现增删改查的几个方法即可

对shiro session管理机制进行扩展 实现session的持久化和共享

session存储到redis缓存中的实现

基于shiro实现session持久化和分布式共享_缓存_15基于shiro实现session持久化和分布式共享_增删改查_16

1、继承CacheManager 实现getCache的方法
2、实现Cache接口 实现基于redis的增删改查
3、将存储redis的实现换成存储数据库就变成了session持久化到数据库的方式

下面介绍另外一个redis的实现方法(对redis的封装比较好 推荐使用) 包括redis集群模式、单机模式

类之间依赖关系图

基于shiro实现session持久化和分布式共享_缓存_17

接下来分析下每一个类的实现

接口 IRedisManager

基于shiro实现session持久化和分布式共享_增删改查_18

该接口有4个实现类

WorkAloneRedisManager redis单机模式的实现类

基于shiro实现session持久化和分布式共享_缓存_19基于shiro实现session持久化和分布式共享_redis_20单机缓存的增删改查

RedisClusterManager redis集群模式的实现类

基于shiro实现session持久化和分布式共享_增删改查_21缓存集群模式的增删改查

WorkAloneRedisManager 的2个实现类 单机和集群分别实现获取redis连接的抽象方法

RedisSentinelManager

基于shiro实现session持久化和分布式共享_redis_22集群模式基于shiro实现session持久化和分布式共享_缓存_23单机模式

以上说的几个类 都是对与redis的操作 还未和shiro的session管理机制交互 下面咱说说怎么与shiro交互的

刚才也说了 想要基于shiro来实现持久化存储 只需要:

第一种方式

1、继承CacheManager 实现getCache的方法
2、实现Cache接口 实现基于redis的增删改查
3、将 CacheManager 设置到 DefaultWebSecurityManager


第二种方式

1、在sessionDAO的实现类中直接 存储到redis中
2、将sessionDAO 设置到 DefaultWebSessionManager

先看第一种方式
  • RedisCacheManager 类

顾命思意 缓存的管理者 那么这个类中保存了很多的缓存
实现CacheManager接口

基于shiro实现session持久化和分布式共享_缓存_24

先看下内存ConcurrentHashMap中是否存在该缓存 如果不存在则定义该缓存然后放入Map中 ;下面来看下 如何定义的缓存

  • RedisCache 类

实现了 Cache 接口

通过IRedisManager接口对缓存进行增删改查操作

再看下第二种方式
RedisSessionDAO

继承AbstractSessionDAO 抽象类
这里面也是通过 IRedisManager接口对缓存进行增删改查操作
内存存储对象为ThreadLocal本质上还是一个Map集合

具体内容就不再重复分析了 朋友们可以下载源码看下即可

源码支持


https://gitee.com/pingfanrenbiji/spring-boot-2.0.3/tree/master/spring-boot-shiro

https://gitee.com/pingfanrenbiji/shiro-redis.git


举报

相关推荐

0 条评论