百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

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

ztj100 2025-07-06 18:05 21 浏览 0 评论

前言

本文写下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

相关推荐

Linux集群自动化监控系统Zabbix集群搭建到实战

自动化监控系统...

systemd是什么如何使用_systemd/system

systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...

Linux服务器日常巡检脚本分享_linux服务器监控脚本

Linux系统日常巡检脚本,巡检内容包含了,磁盘,...

7,MySQL管理员用户管理_mysql 管理员用户

一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...

Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门

1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...

Linux自定义开机自启动服务脚本_linux添加开机自启动脚本

设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...

linux系统启动流程和服务管理,带你进去系统的世界

Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...

CentOS7系统如何修改主机名_centos更改主机名称

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...

前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令

在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...

Linux开机自启服务完全指南:3步搞定系统服务管理器配置

为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...

Kubernetes 高可用(HA)集群部署指南

Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...

Linux项目开发,你必须了解Systemd服务!

1.Systemd简介...

Linux系统systemd服务管理工具使用技巧

简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...

Red Hat Enterprise Linux 10 安装 Kubernetes (K8s) 集群及高级管理

一、前言...

Linux下NetworkManager和network的和平共处

简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...

取消回复欢迎 发表评论: