shiro会话管理

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

一、会话管理

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保存缓存的会话。

相关API:
//如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 getActiveSessions();

1.4 会话验证

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

1.5 案例

1)创建Session ID生成器


2)自定义会话管理

  <property name="sessionIdGenerator" ref="sessionIdGenerator"/>

3)创建会话监听器

4)会话cookie模板

  <!--设置cookie的name-->
  <constructor-arg value="shiro.session"/>
  <!--设置cookie有效时间-->
  <property name="maxAge" value="-1"/>
  <!--设置httpOnly-->
  <property name="httpOnly" value="true"/>

5)SessionManager会话管理器

  <!--设置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"/>

d7f0b849-6744-4ef0-932e-28272ad8b254

二、缓存管理

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)导入相关依赖

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

2)核心接口

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

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

3)核心配置文件

ehcache.xml

5.shiro与ehcache整合

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

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

  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-ehcache</artifactId>
  <version>1.4.1</version>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>

2)实现spring与ehcache缓存

创建spring-ehcache.xml

  <property name="configLocation" value="classpath:ehcache.xml"/>
  <property name="shared" value="true"/>

  <property name="cacheManager" ref="cacheManagerFactory"/>

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

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

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

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

相关文章
|
存储 NoSQL Apache
Apache Cassandra 简介
Apache Cassandra 是一个开源的、分布式、无中心、弹性可扩展、高可用、容错、一致性可调、面向行的数据库,它基于 Amazon Dynamo 的分布式设计和 Google Bigtable 的数据模型,由 Facebook 创建,在一些最流行的网站中得到应用。
24314 2
|
存储 缓存 Linux
Linux RedHat7.4更换阿里云yum源(RHEL7.4)
Linux RedHat7.4更换阿里云yum源(RHEL7.4)
5746 0
|
4月前
|
SQL Java 应用服务中间件
数据库连接池详解及性能优化趋势
Sharding-JDBC所构建的Database Mesh与Service Mesh相互独立,协同工作。服务间的交互由Service Mesh Sidecar负责管理,而基于SQL的数据库访问则交由Sharding-JDBC-Sidecar处理。业务应用无需关心物理部署细节,实现真正的零侵入。Sharding-JDBC-Sidecar与宿主机生命周期绑定,非静态IP,确保了动态和弹性。尽管如此,数据运维操作仍可通过启动Sharding-JDBC-Server进程作为静态IP入口,借助命令行或UI客户端轻松完成。
|
4月前
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
数据可视化 NoSQL BI
如何高效分发任务?推荐6款超实用任务管理工具
在快速发展的互联网和企业环境中,团队协作依赖于精准高效的任务分发。本文探讨任务分发在项目管理中的核心作用,并详细评测6款实用的任务管理工具:板栗看板、Trello、Asana、ClickUp、Monday.com 和 Notion,帮助你找到适合的“高效分发”利器。
396 0
如何高效分发任务?推荐6款超实用任务管理工具
|
存储 搜索推荐 安全
Cookie 探秘:了解 Web 浏览器中的小甜饼
Cookie 探秘:了解 Web 浏览器中的小甜饼
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
767 4
|
存储 算法 Unix
文件系统基础 (二)——文件的物理结构
文件系统基础 (二)——文件的物理结构
869 1
|
分布式计算 大数据 数据库连接
MaxCompute操作报错合集之遇到报错信息 "SERVER_INTERNAL_ERROR" ,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
354 6
|
设计模式 缓存 前端开发
什么是幂等性?四种接口幂等性方案详解!
本文深入分布式系统中的幂等性问题及其解决方案,涵盖数据库唯一主键、乐观锁、PRG模式和防重Token等方法,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
什么是幂等性?四种接口幂等性方案详解!