shiro框架04会话管理+缓存管理+Ehcache使用

news2024/11/23 13:47:02

目录

一、会话管理

1.基础组件

1.1 SessionManager

1.2 SessionListener

1.3 SessionDao

1.4 会话验证

1.5 案例

二、缓存管理

1、为什么要使用缓存

2、什么是ehcache

3、ehcache特点

4、ehcache入门

5、shiro与ehcache整合

1)导入相关依赖(注意:这里使用shiro的1.4.1版本)

2)实现spring与ehcache缓存(创建spring-ehcache.xml)

3)在SecurityManager安全管理器中设置缓存管理器

4)开启Shiro的授权或者认证数据缓存


一、会话管理

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat、WebLogic),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。

所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。

1.基础组件

1.1 SessionManager

会话管理器管理着应用中所有 Subject 的会话的创建、维护、删除、失效、验证等工作。是Shiro 的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager

  1)DefaultSessionManager:使用的默认实现,用于JavaSE环境
  2)ServletContainerSessionManager:使用的默认实现,用于Web环境,其直接使用Servlet容器的会话
  3)DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理

1.2 SessionListener

SessionListener会话监听器用于监听会话创建、过期及停止事件。
  实现方式:
  1)实现SessionListener,必须实现所有方法
  2)继承SessionListenerAdapter,重写指定方法

相关API:
  1)onStart(Session session):监听会话创建事件
  2)onStop(Session session):监听会话销毁事件
  3)onExpiration(Session session):监听会话过期事件

 

1.3 SessionDao

 Shiro提供SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现。

1)AbstractSessionDAO:提供了SessionDAO的基础实现,如生成会话ID等
  2)CachingSessionDAO:提供了对开发者透明的会话缓存的功能,需要设置相应的CacheManager 
  3)MemorySessionDAO:直接在内存中进行会话维护(默认方式)
  4)EnterpriseCacheSessionDAO:提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。

 

 

  //如DefaultSessionManager在创建完session后会调用该方法;
  //如保存到关系数据库/文件系统/NoSQL数据库;redis
  //即可以实现会话的持久化;返回会话ID;主要此处返回的ID.equals(session.getId());  
  Serializable create(Session session);
  //根据会话ID获取会话  
  Session readSession(Serializable sessionId) throws UnknownSessionException;  
  //更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用  
  void update(Session session) throws UnknownSessionException;  
  //删除会话;当会话过期/会话停止(如用户退出时)会调用  
  void delete(Session session);  
  //获取当前所有活跃用户,如果用户量多此方法影响性能  
  Collection<Session> getActiveSessions();

1.4 会话验证

1)Shiro提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话。
  2)出于性能考虑,一般情况下都是获取会话的同时来验证会话是否过期并停止会话的;但是如果在Web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定义的检测会话是否过期,Shiro提供了会话验证调度器来定期检查会话是否过期,SessionValidationScheduler 。
  3)Shrio也提供了使用Quartz会话验证调度器 QuartzSessionValidationScheduler 。

1.5 案例

  <!-- 创建Session ID生成器 -->
  <!-- Session ID 生成器 -->
  <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator">
  </bean>
<!--自定义会话管理-->
<!--sessionDao自定义会话管理,针对Session会话进行CRUD操作-->
  <bean id="customSessionDao" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO">
      <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
  </bean>
<!--会话监听器-->
  <bean id="shiroSessionListener" class="com.zking.ssm.book.shiro.ShiroSessionListener"/>
<!--会话cookie模板-->
  <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
      <!--设置cookie的name-->
      <constructor-arg value="shiro.session"/>
      <!--设置cookie有效时间-->
      <property name="maxAge" value="-1"/>
      <!--设置httpOnly-->
      <property name="httpOnly" value="true"/>
  </bean>
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
      <!--设置session会话过期时间 毫秒 3分钟=180000-->
      <property name="globalSessionTimeout" value="180000"/>
      <!--设置sessionDao-->
      <property name="sessionDAO" ref="customSessionDao"/>
      <!--设置间隔多久检查一次session的有效性 默认60分钟-->
      <property name="sessionValidationInterval" value="1800000"/>
      <!--配置会话验证调度器-->
      <!--<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>-->
      <!--是否开启检测,默认开启-->
      <!--<property name="sessionValidationSchedulerEnabled" value="true"/>-->
      <!--是否删除无效的session,默认开启-->
      <property name="deleteInvalidSessions" value="true"/>
      <!--配置session监听器-->
      <property name="sessionListeners">
          <list>
              <ref bean="shiroSessionListener"/>
          </list>
      </property>
      <!--会话Cookie模板-->
      <property name="sessionIdCookie" ref="sessionIdCookie"/>
      <!--取消URL后面的JSESSIONID-->
      <property name="sessionIdUrlRewritingEnabled" value="false"/>
  </bean>

二、缓存管理

1、为什么要使用缓存

在没有使用缓存的情况下,我们每次发送请求都会调用一次doGetAuthorizationInfo方法来进行用户的授权操作,但是我们知道,一个用户具有的权限一般不会频繁的修改,也就是每次授权的内容都是一样的,所以我们希望在用户登录成功的第一次授权成功后将用户的权限保存在缓存中,下一次请求授权的话就直接从缓存中获取,这样效率会更高一些。

2、什么是ehcache

Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大。是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

注1:本章介绍的是2.X版本,3.x的版本和2.x的版本API差异比较大

3、ehcache特点

1) 够快
      Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.
  2) 够简单
      开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
  3) 够袖珍
      关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。
  4) 够轻量
      核心程序仅仅依赖slf4j这一个包,没有之一!
  5) 好扩展
      Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
  6) 监听器
      缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),做一些统计或数据一致性广播挺好用的
  7) 分布式缓存
      从Ehcache 1.2开始,支持高性能的分布式缓存,兼具灵活性和扩展性

4、ehcache入门

1)导入相关依赖 

<dependency>
     <groupId>net.sf.ehcache</groupId>
     <artifactId>ehcache</artifactId>
     <version>2.10.0</version>
  </dependency>

2)核心接口

  CacheManager:缓存管理器
  Cache:缓存对象,缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口
  Element:单条缓存数据的组成单位

CacheManager -> Cache(可定义各种缓存策略) -> Element

3)核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存-->
    <!--path:指定在硬盘上存储对象的路径-->
    <!--java.io.tmpdir 是默认的临时文件路径。 可以通过如下方式打印出具体的文件路径 System.out.println(System.getProperty("java.io.tmpdir"));-->
    <diskStore path="java.io.tmpdir"/>


    <!--defaultCache:默认的管理策略-->
    <!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断-->
    <!--maxElementsInMemory:在内存中缓存的element的最大数目-->
    <!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上-->
    <!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false-->
    <!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问-->
    <!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问-->
    <!--memoryStoreEvictionPolicy:缓存的3 种清空策略-->
    <!--FIFO:first in first out (先进先出)-->
    <!--LFU:Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存-->
    <!--LRU:Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存-->
    <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
                  timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>


    <!--name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)-->
    <cache name="stuCache" eternal="false" maxElementsInMemory="100"
           overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
           timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/>
</ehcache>

5、shiro与ehcache整合

1)导入相关依赖(注意:这里使用shiro的1.4.1版本)

:之前是使用的1.3.1版本,在安全退出的时候引发了UnknownSessionException: There is no session with id错误,通过升级shiro版本后问题解决!!!o(╥﹏╥)o 一下午时间啊!!!

<dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.4.1</version>
  </dependency>
<!-- spring对ehcache的相关支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

2)实现spring与ehcache缓存(创建spring-ehcache.xml)

<!--使用ehcache缓存-->
  <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
      <property name="configLocation" value="classpath:ehcache.xml"/>
      <property name="shared" value="true"/>
  </bean>
  <!-- 默认是cacheManager -->
  <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
      <property name="cacheManager" ref="cacheManagerFactory"/>
  </bean>

3)在SecurityManager安全管理器中设置缓存管理器

<!--设置缓存管理器-->
  <property name="cacheManager" ref="cacheManager"/>
  

4)开启Shiro的授权或者认证数据缓存

在自定义Realm配置中开启并设置授权或者认证数据缓存

<!--开启缓存-->
  <property name="cachingEnabled" value="true"/>
  <!--开启授权缓存-->
  <property name="authorizationCachingEnabled" value="true"/>
  <!--设置ehcache的中的缓存对象名-->
  <property name="authorizationCacheName" value="shiroAuthzCache"/>

 注:这里只开启了授权缓存,避免每次请求都要重新查询授权数据!!!

以上就是有关会话管理的分享,关于Shiro到这也就完结了,我会发出项目包,也就是我学习Shiro所写的那个项目。感谢大家观赏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2019银川F,ccpc威海D - Sternhalma 2022

1401D - Maximum Distributed Tree 求每个边经过的次数&#xff0c;假设求u,v这条边的次数&#xff0c;边的左端是u这个集合一共有n-siz[v]个点&#xff0c;右端是v这个集合有siz[v]个端点&#xff0c;经过这条边的次数就是siz[v]*(n-siz[v]),然后再按照次数多的乘以大的质因数…

【附源码】Python计算机毕业设计汽车租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Go 语言中的 Moduels 管理(Let‘s Go 三十四)

在 Go 1.11以前使用包管理一直被开发者所诟病。既然GOPATH这种包管理引起了一线开发者的一片骂声&#xff0c;所以&#xff0c;Go官方体恤一线开发者对GOPATH这种包管理的情绪&#xff0c;一直致力努力提供对一线开发者友好的包管理解决方法而奋斗。从最初的GOPATH到GO VENDOR&…

基于遗传算法、元胞自动机邻域和随机重启爬山混合优化算法(GA-RRHC)的柔性车间调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LeetCode50天刷题计划第二季(Day 27 — 寻找旋转排序数组中的最小值(9.50- 11.20)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、题目寻找旋转排序数组中的最小值示例提示&#xff1a;二、思路三、代码前言 芜湖 一、题目 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#…

web前端期末大作业——基于HTML+CSS+JavaScript实现中国茶文化(30页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

大数据开发是做什么的?怎样入门?

其实现在有很多小伙伴看中了大数据的发展前景&#xff0c;但是其实不知道大数据开发具体是做什么的&#xff0c;又该怎么学习&#xff1f;学习了之后又该做什么&#xff1f; 下面具体给你分析下大数据开发是做什么的&#xff0c;又需要学习和掌握哪些技能~ 大数据开发做什么&a…

致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓01 漏洞描述02 影响范围03 验证方式04 利用方式05 修复方案01 漏洞描述 致远OA是一套办公协同管理软件。由于致远OA旧版本某些接口存在未授权访问&#xff0c;以及部分函数存在过滤不足&#xff0c;攻…

大数据实战之前戏

开发背景 因为要开发一套通话详单系统。该系统上每天产生1亿条通话话单&#xff0c;要保存一个月的通话话单。也就是保存30亿条通话&#xff0c;能够做到准实时的通话详单查询。于是采用大数据架构进行话单的保存和查询。 服务器规划 为了验证系统的可用性&#xff0c;我先搭…

从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输

从零学习 InfiniBand-network架构&#xff08;七&#xff09; —— IB协议中数据如何传输 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-n…

C++ 智能指针最佳实践源码分析

智能指针在 C11 标准中被引入真正标准库&#xff08;C98 中引入的 auto_ptr 存在较多问题&#xff09;&#xff0c;但目前很多 C开发者仍习惯用原生指针&#xff0c;视智能指针为洪水猛兽。但很多实际场景下&#xff0c;智能指针却是解决问题的神器&#xff0c;尤其是一些涉及多…

QT之Windows开发及源码调试环境搭建

QT之Windows开发及源码调试环境搭建1. QT 安装2. 配置源码调试2.1 QTCreator2.2 Visual Studio 20193. 参考1. QT 安装 QT对5.15以及以上版本提供在线安装工具 官方链接清华镜像&#xff0c;但是这里面没由Windows的在线安装工具(2022/11/11查看的时候没有) 这里安装以QT 5.…

全是狠活!SpringBoot文档也太那个了,图文并茂详尽讲解

前沿 SpringBoot是由Pivotal团队提供的在Spring框架基础之上开发的框架&#xff0c;其设计目的是用来简化应用的初始搭建以及开发过程。 SpringBoot本身并不提供Spring框架的核心特性以及扩展功能&#xff0c;只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是…

【JavaSE】继承

文章目录1. 如何继承2. 子类如何访问父类的成员2.1 子类中访问父类的成员变量2.2 子类中访问父类的成员方法3. super关键字4. 如何写构造方法前言&#xff1a;为方便讲解一个java文件写多个类。 1. 如何继承 class Cat {public String name;public int age;public String sex;…

c++基础篇(一篇文章带你进入c++的新手村)

前沿&#xff1a; c作为目前比较的流行的语言之一&#xff0c;在就业上也是运用比较广泛的语言之一&#xff0c;并且经过这么多年的历练久经不衰&#xff0c;所以说选择学c是一个不错的选择^_^&#xff0c;前面看到一个段子&#xff0c;如何在21天精通c&#xff0c;我动态里有这…

git 记录

git 工作区介绍 workspace&#xff1a;工作区&#xff0c;就是平时存放项目代码的地方。Index/Stage&#xff1a;暂存区&#xff0c;用于临时存放你的改动&#xff0c;事实上只是一个文件&#xff0c;保存即将提交到文件列表信息。Repository&#xff1a;仓库区&#xff08;或版…

单机hbase-2.4.15配置snappy压缩

单机hbase配置snappy压缩 前言 1. 过程比较坎坷&#xff0c;网上帖子说法不一&#xff0c;以下过程是参考几个帖子亲自走过一遍&#xff0c;并最终可以成功建表。2. 本人安装的所有目录均为/data/test-hbase&#xff0c;涉及目录的替换为自己的目录即可。参考连接 https://bl…

【黑马程序员】Redis 课程 P37 的练习_三种方式实现功能_【黑马点评项目】给店铺类型查询业务添加缓存

本博客内容对应的视频为&#xff1a;https://www.bilibili.com/video/av766995956/?p37补充介绍&#xff1a;【黑马点评项目】是黑马官方于 2022-02-28 在 BiliBili 发表的学习视频教程的练手项目 1.简介 练习&#xff1a;给店铺类型查询业务添加缓存 店铺类型在首页和其它多…

栈和队列(顺序表、单链表形式)

栈和队列栈栈.顺序表结构体的设计栈的初始化栈的销毁入栈出栈获取栈顶数据判断栈空栈中有效元素的个数Stack.hStack.ctest.c栈.单链表结构体设计栈的初始化栈的销毁入栈出栈获取栈顶元素判断栈是否为空获取栈中元素个数Stack.hStack.ctest.c队列队列.顺序表结构体的设计队列的初…

学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…