当前位置: 首页 > news >正文

第十一章 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&#xff1a;查看并编辑叠层4、PCB剪裁&#xff08;可选&#xff09;5、创建SiPro6、创建分析模型7、查看分析结果8、创建原理图9、系统行为级仿真 引言 DDR4仿真将按照以下几个步骤进行&#xff1a; 新建Work…...

Android Studio插件版本与Gradle 版本对应关系

一、背景 Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。 虽然 Android 插件通常会与 Android Studio 的更新步调保持一致&#xff0c;但插件&#xff08;以及 Gradle 系统的其余部分&#xff09;可…...

Uni-App-01

HBuilder安装卸载 安装 官网地址&#xff1a;https://www.dcloud.io/hbuilderx.html 下载HBuilder最新版 解压到安装目录&#xff0c;路径中不要有中文和空格 在桌面上增加快捷方式 卸载 执行reset.bat 删除HBuilder文件夹&#xff08;如果提示文件被占用&#xff0…...

Java版本鸿鹄工程项目管理系统源码概述

项目背景 随着企业规模的扩大和业务的复杂化&#xff0c;传统的工程项目管理方式已经无法满足高效、准确、实时的管理需求。为了提高工程管理效率、优化资源配置、降低风险并控制成本&#xff0c;企业决定通过数字化转型&#xff0c;构建一个基于Spring Cloud、Spring Boot、M…...

基于echarts、php、Mysql开发的数据可视化大屏

大屏效果展示 管理员进入数据可视化页面将看到数据可视化大屏。大屏内容包括两个条形图&#xff0c;用于统计当前网站所有用户的MBTI 16型人格分布&#xff1b;玫瑰图&#xff0c;用于展示当前网站用户MBTI四个维度&#xff0c;八个字母的占比&#xff1b;折线图&#xff0c;用…...

Me-and-My-Girlfriend-1

Me-and-My-Girlfriend-1 解题 信息收集 nmap扫描存活主机 我的虚拟机为131 所以发现130为目标靶机。 查看网站&#xff0c;找到可利用点 使用浏览器查看&#xff0c;使用xff伪造本地用户。 注册用户cat&#xff0c;观察url有url_id,改为5&#xff0c;发现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. 文本生成未来展望 结语 前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;正以前所未有的速度改变着…...

IFC模型文本的含义

以下代码是一个STEP文件&#xff08;ISO-10303-21标准&#xff09;&#xff0c;它是一种用于表示产品数据的国际标准。STEP文件通常用于在不同的计算机辅助设计&#xff08;CAD&#xff09;系统之间交换数据。下面是对这段代码的逐行解释&#xff1a; HEADER部分&#xff1a; …...

构建高效评奖系统:SpringBoot在教育领域的应用

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生评奖评优管理系统的开发全过程。通过分析学生评奖评优管理系统管理的不足&#xff0c;创建了一个计算机管理学生评奖评优管理系统的方案。文章介绍了学生评奖…...

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…...

在使用代理IP时,需要注意以下几点:

1. 代理IP的质量和稳定性直接影响爬虫的效果。因此&#xff0c;我们需要定期更新代理IP列表&#xff0c;并筛选出可用的代理IP。 2. 有些代理IP可能存在被目标网站封禁的风险。因此&#xff0c;我们需要合理使用代理IP&#xff0c;避免过度频繁地访问目标网站。 3. 在使用代…...

深入理解Java基础概念的高级应用(1/5)

目录 1. Java内存模型&#xff1a;堆、栈与方法区 示例代码&#xff1a;对象存储位置 2. 类加载器的工作原理 示例代码&#xff1a;自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码&#xff1a;基础类型…...

高可用HA软件

高可用HA&#xff08;High Availability&#xff09;软件在分布式系统架构设计中至关重要&#xff0c;它们能够减少系统停机时间&#xff0c;确保应用程序持久、不间断地提供服务。以下是四款常用的高可用HA软件介绍&#xff1a; Keepalived Keepalived起初是为LVS&#xff08;…...

《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析

本文是将文章《近似线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-41 解释&#xff1a; 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语言指针&#xff0c;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基础环境搭建&#xff08;CentOS7&#xff09;- 安装Mysql和Hive 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Orac…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...