第十一章 Shiro会话管理和加密
学习目标
- 11.1 会话管理
- 11.1.1 会话相关API
- 一、获取会话
- 二、会话属性管理
- 三、会话信息获取
- 四、会话控制
- 五、会话监听
- 六、会话DAO
- 七、会话验证
- 11.2 缓存
- 一、缓存接口
- 二、内置缓存实现
- 三、配置缓存
- 四、使用缓存
- 五、缓存清理
- 六、注意事项
前面两章我们已经掌握了Shiro四大基石的认证和授权,(如果没有了解可以去我主页看看 第九至十章的内容来学习)且基于SpringBoot+Shiro实现了动态认证和授权,基本完成CRM客户关系管理系统重的权限控制。
本章我们学习另两个基石:会话管理和加密,并对上章的动态授权进行优化,使用Redis缓存用户权限信息。
11.1 会话管理
11.1.1 会话相关API
Shiro是一个强大的Java安全框架,提供了完整的企业级会话管理功能。在Shiro中,与会话相关的API主要包括以下几个方面:
一、获取会话
- Subject.getSession():获取当前用户的会话。如果当前没有创建会话对象,则会创建一个新的会话。这等价于Subject.getSession(true)。
- Subject.getSession(boolean create):根据参数决定是否创建一个新的会话。如果create为true且当前没有会话,则创建一个新的会话;如果为false且当前没有会话,则返回null。
二、会话属性管理
- session.setAttribute(key, value):设置会话属性。
- session.getAttribute(key):获取会话属性。
- session.removeAttribute(key):删除会话属性。
三、会话信息获取
- session.getId():获取当前会话的唯一标识。
- session.getHost():获取当前Subject的主机地址。在会话开始时,Shiro会存储用户的IP地址和主机名,以此可以判断用户的位置。
- session.getTimeout() & session.setTimeout(毫秒):获取/设置当前Session的过期时间。
- session.getStartTimestamp() & session.getLastAccessTime():获取会话的启动时间及最后访问时间。如果是JavaSE应用,需要自己定期调用session.touch()去更新最后访问时间;如果是JavaEE应用,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间。
四、会话控制
- session.touch():更新会话的最后访问时间,让会话保持活跃状态。
- session.stop():销毁会话。当调用Subject.logout()时,会自动调用session.stop()方法来销毁会话。在Web应用中,调用HttpSession.invalidate()也会自动调用session.stop()来销毁Shiro的会话。
五、会话监听
Shiro提供了会话监听器,用于监听会话的创建、过期及停止事件。要实现自己的会话监听器,需要实现SessionListener接口,并重写以下方法:
- onStart(Session session):监听会话创建事件。
- onStop(Session session):监听会话销毁事件。
- onExpiration(Session session):监听会话过期事件。
六、会话DAO
Shiro提供了SessionDAO接口及其多种实现,用于会话的CRUD(创建、读取、更新、删除)操作。常用的实现类包括:
- AbstractSessionDAO:提供了SessionDAO的基础实现,如生成会话ID等。
- CachingSessionDAO:提供了对开发者透明的会话缓存功能,需要设置相应的CacheManager。
- MemorySessionDAO:直接在内存中进行会话维护。
- EnterpriseCacheSessionDAO:提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。
七、会话验证
Shiro提供了会话验证调度器,用于定期验证会话是否已过期。如果过期,将停止会话。Shiro提供了两种会话验证调度器:
- SessionValidationScheduler:默认的会话验证调度器。
- QuartzSessionValidationScheduler:使用Quartz作为定时任务的会话验证调度器。使用Quartz时需要导入shiro-quartz依赖。
以上内容涵盖了Shiro中与会话相关的API及其主要功能。开发者可以根据这些API和功能来实现自定义的会话管理逻辑。
11.2 缓存
在Apache Shiro中,缓存是提高性能和效率的关键组件。Shiro提供了多种缓存实现,允许开发者根据需求选择合适的缓存机制。以下是Shiro中与缓存相关的关键概念和代码示例:
一、缓存接口
Shiro的缓存接口主要包括Cache<K, V>
和CacheManager。
Cache<K, V>
:定义了缓存的基本操作,如获取、放入、删除缓存项等。- CacheManager:管理多个缓存实例的工厂,可以根据缓存的名称获取对应的缓存实例。
二、内置缓存实现
Shiro提供了几种内置的缓存实现:
- MemoryConstrainedCacheManager:基于内存的缓存管理器,可以设置缓存的最大数量和每个缓存项的最大大小。
- EhcacheManager:集成Ehcache作为缓存实现。
- HazelcastCacheManager:集成Hazelcast作为分布式缓存实现。
- JCacheManager:集成JSR-107(Java缓存API)作为缓存实现。
三、配置缓存
在Shiro的配置文件中(如shiro.ini或Spring配置文件),可以配置缓存管理器。
例如,在shiro.ini中配置Ehcache:
[main]
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
cacheManager.configLocation = classpath:ehcache.xml
securityManager.cacheManager = $cacheManager
在Spring配置中,可以这样配置:
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="cacheManager" ref="cacheManager"/> <!-- 其他配置 -->
</bean>
四、使用缓存
在Shiro中,缓存通常用于存储授权信息(如角色和权限)和身份验证信息(如用户信息和会话)。开发者可以在自定义的Realm或过滤器中使用缓存来提高性能。
例如,在自定义Realm中,可以使用缓存来存储从数据库或其他数据源加载的用户信息和权限信息:
public class MyRealm extends AuthorizingRealm { // 假设有一个缓存实例 private Cache<String, AuthorizationInfo> authorizationCache; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); AuthorizationInfo info = authorizationCache.get(username); if (info == null) { // 从数据源加载授权信息 info = loadAuthorizationInfo(username); // 将授权信息放入缓存 authorizationCache.put(username, info); } return info; } // 加载授权信息的方法 private AuthorizationInfo loadAuthorizationInfo(String username) { // 实现从数据源加载授权信息的逻辑 } // 设置缓存实例的方法(通常在Spring配置中注入) public void setAuthorizationCache(Cache<String, AuthorizationInfo> authorizationCache) { this.authorizationCache = authorizationCache; }
}
五、缓存清理
由于缓存中的数据可能会过期或无效,因此需要定期清理缓存。Shiro的缓存实现通常会自动处理缓存过期和清理的问题,但开发者也可以根据需要手动清理缓存。
例如,在Ehcache中,可以通过配置元素来设置缓存的清理策略,如LRU(最近最少使用)、LFU(最不经常使用)等。
在Shiro的自定义实现中,也可以调用Cache.clear()方法来手动清理缓存。
六、注意事项
- 缓存中的数据可能是敏感的,因此要确保缓存的配置和访问控制是安全的。
- 缓存的性能提升是以牺牲内存为代价的,因此要合理设置缓存的大小和清理策略。
- 在分布式环境中,要使用分布式缓存解决方案来确保数据的一致性。
通过以上配置和使用方法,开发者可以在Shiro中充分利用缓存来提高应用程序的性能和效率。
相关文章:
第十一章 Shiro会话管理和加密
学习目标 11.1 会话管理11.1.1 会话相关API一、获取会话二、会话属性管理三、会话信息获取四、会话控制五、会话监听六、会话DAO七、会话验证 11.2 缓存一、缓存接口二、内置缓存实现三、配置缓存四、使用缓存五、缓存清理六、注意事项 前面两章我们已经掌握了Shiro四大基石的认…...
DDR4单个DQ仿真实战(一)
目录 引言1、新建Workspace2、导入brd文件3、在SiPro中打开Layout:查看并编辑叠层4、PCB剪裁(可选)5、创建SiPro6、创建分析模型7、查看分析结果8、创建原理图9、系统行为级仿真 引言 DDR4仿真将按照以下几个步骤进行: 新建Work…...
Android Studio插件版本与Gradle 版本对应关系
一、背景 Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。 虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可…...
Uni-App-01
HBuilder安装卸载 安装 官网地址:https://www.dcloud.io/hbuilderx.html 下载HBuilder最新版 解压到安装目录,路径中不要有中文和空格 在桌面上增加快捷方式 卸载 执行reset.bat 删除HBuilder文件夹(如果提示文件被占用࿰…...
Java版本鸿鹄工程项目管理系统源码概述
项目背景 随着企业规模的扩大和业务的复杂化,传统的工程项目管理方式已经无法满足高效、准确、实时的管理需求。为了提高工程管理效率、优化资源配置、降低风险并控制成本,企业决定通过数字化转型,构建一个基于Spring Cloud、Spring Boot、M…...
基于echarts、php、Mysql开发的数据可视化大屏
大屏效果展示 管理员进入数据可视化页面将看到数据可视化大屏。大屏内容包括两个条形图,用于统计当前网站所有用户的MBTI 16型人格分布;玫瑰图,用于展示当前网站用户MBTI四个维度,八个字母的占比;折线图,用…...
Me-and-My-Girlfriend-1
Me-and-My-Girlfriend-1 解题 信息收集 nmap扫描存活主机 我的虚拟机为131 所以发现130为目标靶机。 查看网站,找到可利用点 使用浏览器查看,使用xff伪造本地用户。 注册用户cat,观察url有url_id,改为5,发现alice用户。 将…...
R语言实现GWAS meta分析(1)
1、基于数据集的Meta分析 datafilenamec("data1.txt","data2.txt"), setwd(workdir) library(Metalgwas) a1 name1c() for(i in datafilename){ assign(paste("file",a,sep""),data.table::fread(paste(getwd(),"/","…...
Kafka-代码示例
一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…...
LLVM - 编译器前端-llvm 基本块、指令、函数 的关系
一:基础概念: 在 LLVM 中,基本块、指令和函数是构建中间表示(IR)的核心概念,它们之间有着紧密的关系,首先了解下基本概念。 1. 基本块(Basic Block) 定义:基本块是一个不包含任何跳转指令的线性代码段,执行顺序是从头到尾。每个基本块至少有一个入口和一个出口。特…...
探索人工智能在自然语言处理中的应用
探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代,自然语言处理(NLP)作为人工智能(AI)的一个重要分支,正以前所未有的速度改变着…...
IFC模型文本的含义
以下代码是一个STEP文件(ISO-10303-21标准),它是一种用于表示产品数据的国际标准。STEP文件通常用于在不同的计算机辅助设计(CAD)系统之间交换数据。下面是对这段代码的逐行解释: HEADER部分: …...
构建高效评奖系统:SpringBoot在教育领域的应用
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了学生评奖评优管理系统的开发全过程。通过分析学生评奖评优管理系统管理的不足,创建了一个计算机管理学生评奖评优管理系统的方案。文章介绍了学生评奖…...
「二叉树进阶题解:构建、遍历与结构转化全解析」
文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目: 样例: 可以看见,唯一特殊的就…...
在使用代理IP时,需要注意以下几点:
1. 代理IP的质量和稳定性直接影响爬虫的效果。因此,我们需要定期更新代理IP列表,并筛选出可用的代理IP。 2. 有些代理IP可能存在被目标网站封禁的风险。因此,我们需要合理使用代理IP,避免过度频繁地访问目标网站。 3. 在使用代…...
深入理解Java基础概念的高级应用(1/5)
目录 1. Java内存模型:堆、栈与方法区 示例代码:对象存储位置 2. 类加载器的工作原理 示例代码:自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码:基础类型…...
高可用HA软件
高可用HA(High Availability)软件在分布式系统架构设计中至关重要,它们能够减少系统停机时间,确保应用程序持久、不间断地提供服务。以下是四款常用的高可用HA软件介绍: Keepalived Keepalived起初是为LVS(…...
《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析
本文是将文章《近似线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式 9-41 解释: L ( w , b , ξ , α , μ ) 1 2 ∥ w ∥ 2 C ∑ i 1 N ξ i − ∑ i 1 N α i ( y i ( w T x i b ) − ( 1 − ξ …...
9.指针和字符串string类型
指针和字符串string类型 1.指针2.字符串string类型 1.指针 C完全兼容C语言指针,C多出一个this指针 交换两数 #include <iostream>using namespace std;void swap(int *a,int *b){int temp;temp *a;*a *b;*b temp; }int main() {//交换前int a 50;int b …...
八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive
Linux基础环境搭建(CentOS7)- 安装Mysql和Hive 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Orac…...
海量数据面试题
⭐️前言⭐️ 本篇文章主要针对在面试时可能涉及到的海量数据的面试题,该类型面试题常常考虑通过位图、布隆过滤器或者哈希的方式来解决。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何…...
基于SSM积分商城管理系统的设计与实现(源码+lw+部署文档+讲解等)
前言 伴随着基础网络设施的不断进步和终端电子设备的高度普及,互联网用户规模越来越大。现在人们越来越离不开计算机网络、互联网所带来的好处了,现如今不同的网站系统遍地都是,现在已经不同于以往的传统的管理方式了,只有跟上时代…...
MLP预售开启,革新去中心化通信生态:智能手机与AI Agent齐上阵
2024年10月22日,Matrix Layer Protocol(MLP)宣布其备受期待的第一期产品正式进入预售阶段。随着Web3世界的不断发展,去中心化技术已经深入到我们日常生活的方方面面。作为Web3世界中炙手可热的创新项目,Matrix Layer P…...
js获取浏览器指纹
Canvas指纹法 来源:https://www.cnblogs.com/leijing0607/p/8044218.html 从根本上来说,每一种浏览器都会使用不同的图像处理引擎,不同的导出选项,不同的压缩等级,所以每一台电脑绘制出的图形都会有些许不同…...
乐尚代驾的项目问题
订单状态如果在流转的过程中卡住了,怎么办? 卡住的原因有可能是: 网络问题 网络不稳定或中断可能导致订单状态更新的请求无法及时发送或接收。例如,司机端在更新代驾车辆信息时,如果网络出现故障,可能无法…...
uniapp app.onshow 和 onMounted一样用吗
在uni-app中,onShow和onMounted并不完全相同,它们分别属于应用生命周期和组件生命周期。 应用生命周期中的onShow 在uni-app中,onShow是应用生命周期的一部分,它会在应用启动或从后台进入前台时触发。这意味着它不仅仅局限于页…...
基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)
源码地址:https://download.csdn.net/download/2302_79553009/89933699 项目简介 本项目旨在构建一个基于MBTI(迈尔斯-布里格斯性格分类指标)理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发…...
【问题解决】连接mysql时报错caching_sha2_password can not load
一, 问题 在连接Mysql时报错, caching_sha2_password can not load 二,问题原因 报错信息 "caching_sha2_password can not load" 通常出现在尝试连接到使用 MySQL 8.0 或更高版本的数据库时,因为从 MySQL 8.0 开始&a…...
【瑞吉外卖】-day01
目录 前言 第一天项目启动 获取资料 创建项目 编辑 连接本地数据库 连接数据库 修改用户名和密码 编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…...
钉钉与金蝶云星空数据集成:提高企业付款申请单处理效率
钉钉数据集成到金蝶云星空:付款申请单的自动下推生成 在企业日常运营中,如何高效地管理和处理付款申请单是一个关键问题。为了提升这一流程的效率,我们采用了轻易云数据集成平台,将钉钉中的付款申请单数据无缝对接到金蝶云星空系…...
网站的管理权限有什么用/网站制作策划
误区: 1.基础最重要,所以什么英语数学应该努力学好。 2.交际比技术更重要 3.刻苦勤奋最重要 4. 多学几门 我的看法: 1. 废话。假如你是个没有基础的人,你去学习编程当然会有很多不足的地方。但是如果你觉得基础很重要,…...
建站公司建的网站能改动吗/微营销
100万存银行1年能有多少利息?1、如果是存1年定期,存款利率为1.5%,那100万存一年的利息就是1.5万,均摊到每个月就只有1250元,这点钱估计也就勉强够吃饭的,想要维持正常生活基本上是不可能。好在,…...
合肥市城乡城乡建设局网站/seo推广网站
2019/07/20 尽管不甚了解,但在我的脑海里,她的笑就像冬日里的阳光一般灿烂温暖。 2019/07/21 保持今日式默默关注,另外中耳炎确实难受。 2019/07/28 也不知道啥时候中耳炎能好,最近要努力整爬虫了。第二天永远都比第一天更想。 转…...
幼儿园网站建设运行情况/最好的关键词排名优化软件
在说道主题前,先来啰嗦两句,o()︿︶)o 唉,不说两句心里就有个疙瘩,也许这就是所谓的强迫症吧,好了说说我想啰嗦的,其实也就是这样子的,关于Java开发工具箱的下载以及环境的配置。Java开发工具箱…...
中信建设有限责任公司山东分公司/seo职位要求
机器人感知:因子图在SLAM中的应用 第一章:引言 1.首先提出来机器人中的推断问题,SLAM问题是根据先验信息(包括之前时刻的位姿以及已知路标点信息)以及传感器测得信息(测到的路标点信息)这两个进行推断,推断出该时刻的位姿以及未知…...
广东品牌网站建设/搜索引擎优化的技巧
根据最新的数据统计,Java和JavaScript主导了开发者,拥有大量忠实粉丝(开发者)。然而,随着更多的应用程序逐渐转移到云上,这种情况可能会发生变化。当苹果公司和Facebook争相着去推出新的编程语言࿰…...