C#session共享+redis_基于shiro实现session持久化和分布式共享

前言

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

必要性

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

shiro对session的管理机制

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

shiro中的session相关类继承关系

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

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

sessionDAO
cb7fa445197a4ff122b894498828d407.png
AbstractSessionDAO
e6f9e97eb09136b38a3ac4b12d3de8ab.png
97ffb1112341edd3a7bdd49d51b726ad.png
CachingSessionDAO
e8aaa62b293c485d94d34b0c458d434f.png
先看下 CacheManager接口的实现
bd4b42b50af1f2649aceb5686edc340e.png
2261fc1ce9ee4c3345d3d3e638effb26.png
748350c49da2a9fe6676257619916a2f.png
继续回到 CachingSessionDAO
bf35e0a0eb86d8aa5b83932c13a1bc72.png
14dcb3bdebe7ae15acaee1396fe62eca.png
11e8af50588f80d2a67020187b7e1989.png
278a6fc31c6f131d975c5b85ec17787b.png
f4db243fe2a3ef72b8213c1651481b73.png

更新session

aa0cac7b59d2d19bdbbc12a5f4c48716.png

删除session

MemorySessionDAO
这里面也是类似的方法 基于ConcurrentHashMap的增删改查
EnterpriseCacheSessionDAO
这里面也是类似的方法 基于ConcurrentHashMap的增删改查
源码看到这里的小小感受
1、shiro对session的保存都是基于内存 通过ConcrrentHashMap集合进行存储2、如果想通过数据库、缓存或文件存储的话 需要自己实现 而实现的方式也很简单 就是需要实现增删改查的几个方法即可

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

session存储到redis缓存中的实现

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

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

类之间依赖关系图

db218531afa1abb8ee45e60ebff35c16.png

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

接口 IRedisManager

9bafeb819decc77471d7ba726c85c043.png
该接口有4个实现类

WorkAloneRedisManager redis单机模式的实现类

715f934dea47c2784e1243d48f2680f9.png
2f9d2f3806e78f3bb680ae41093d8934.png

单机缓存的增删改查

RedisClusterManager redis集群模式的实现类

8e53c76fe90222d65d950dcebb090595.png

缓存集群模式的增删改查

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

RedisSentinelManager
3ba13c7679800fe12f6ad63b146b56b4.png

集群模式

9534119640919217f93a20303281ebdc.png

单机模式

以上说的几个类 都是对与redis的操作 还未和shiro的session管理机制交互 下面咱说说怎么与shiro交互的刚才也说了 想要基于shiro来实现持久化存储 只需要:第一种方式1、继承CacheManager 实现getCache的方法2、实现Cache接口 实现基于redis的增删改查3、将 CacheManager 设置到 DefaultWebSecurityManager第二种方式1、在sessionDAO的实现类中直接 存储到redis中2、将sessionDAO 设置到 DefaultWebSessionManager
先看第一种方式
  • RedisCacheManager 类
顾命思意 缓存的管理者 那么这个类中保存了很多的缓存实现CacheManager接口
2eb4d788a2ead59821bf5533ae89c780.png
先看下内存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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值