基于shiro实现session持久化和分布式共享
前言
本文写下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-shirohttps://gitee.com/pingfanrenbiji/shiro-redis.git
本文使用 mdnice 排版
基于shiro实现session持久化和分布式共享相关推荐
- shiro 的session持久化
对于分布式系统,一般都牵扯到Session共享问题, 而想实现Session共享,就要实现Session的持久化操作,即是将内存中的Session持久化至缓存数据库. SessionDAO是Shiro ...
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
- Session分布式共享 = Session + Redis + Nginx
一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下. Session:在计算机中,尤其是在网络应用中,称为"会话控制 ...
- 什么是Session分布式共享
在了解session分布式共享之前先来了解Session.Redis和Nginx的相关知识. 一.Session相关知识 1.Session 介绍 Session在网络应用中,称为"会话控制 ...
- 基于Spring Session实现JIM分布式Session
基于Spring Session实现JIM分布式Session 前引 在实际项目中,应用程序经常会以集群方式部署线上,一般来说无状态的应用程序是理想的部署方式,一旦应用程序拥有状态(比如Session ...
- 集群共享session;shiro实现session共享;springboot实现redis共享session;
shiro实现共享session;springboot集成redis共享session;集群环境下shiro共享session 一.实现session共享 1. 聊聊session共享 2. shir ...
- 详解Session分布式共享(.NET CORE版)
一.前言&回顾 在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的S ...
- 【Session】Tomcat中Session持久化到文件系统或数据库
参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...
- SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (三) 鉴权
项目Github地址: https://github.com/baiye21/ShiroDemo SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (一) 简介与配置 S ...
最新文章
- Seq2Seq实现闲聊机器人
- PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP
- linux redis 删除_Redis-安装amp;删除【Linux 版】
- JDBC分页查询及实现
- 【nosql】NoSql是什么?
- Mongodb的oplogsize修改
- Avast! 4 Server 服务器版license许可文件获得方法
- linux制作img镜像文件,制作img镜像文件的5种方法 .
- 软件打不开且显示乱码的解决办法
- ISE如何生成msc文件,并写入flash中
- 稳压电源集成控制器的发展
- 基于CST电磁仿真软件的7-10GHz的微带带通滤波器的设计
- 关于人工智能的一些介绍与看法
- Java NIO简介
- 洞见2021 中国企业服务年会高清大图来啦~!请查收
- 电信业务经营许可年报流程图文指南,教你年报怎么填
- 卷积核——Roberts、Prewitt、Sobel、Lapacian、DoG、LoG算子
- unity3d音频基础知识
- 关于webrtc的多人视频会议的杂乱记录
- 台式电脑F1F2变成音量键怎么办