当前位置:首页 > 技术知识 > 正文内容

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

maynowei6个月前 (09-13)技术知识75

前言

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

必要性

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

shiro对session的管理机制

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

shiro中的session相关类继承关系

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

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

sessionDAO

AbstractSessionDAO

CachingSessionDAO

先看下 CacheManager接口的实现
继续回到 CachingSessionDAO

更新session

删除session

MemorySessionDAO

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

EnterpriseCacheSessionDAO

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

源码看到这里的小小感受

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

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

session存储到redis缓存中的实现

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

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

类之间依赖关系图

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

接口 IRedisManager

该接口有4个实现类

WorkAloneRedisManager redis单机模式的实现类

单机缓存的增删改查

RedisClusterManager redis集群模式的实现类

缓存集群模式的增删改查

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

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-shiro
https://gitee.com/pingfanrenbiji/shiro-redis.git

相关文章

Objective-C :Category(category什么意思)

Category 引入在日常的开发中,可能会碰到这样的需求:给某个类增加方法。比如说,需要给NSString类增加一个打印的方法。当然,我们可以新建一个类比如TestString,并继承NSStrin...

Android之自定义ListView(一)(android 自定义view绘制流程)

PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进.学习内容:1.自定义View实现ListView的Ite...

分析 Rust 程序的火焰图(rust火吗)

分析 Rust 程序的火焰图(Flame Graph)是定位性能瓶颈的核心手段,其核心是通过可视化的函数调用栈和时间分布,找到 CPU 耗时、内存分配、锁竞争等热点。以下是详细的分析方法和步骤,结合...

如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头对于Java领域中的锁,其实从接触Java至今,我相信每一位Java Developer都会有这样的一个...

Linux系统编程:条件变量为什么要用锁

条件变量可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与之相关的互斥锁。具体定义如下:等待:in...

centos系统安装oracle简易客户端instantclient

一、目录1:centos 环境准备2:instant client 下载3:instant client 安装4:instant client 配置5:测试连接二、安装步骤1:zip,unzip命令安...