Shiro会话管理和加密

会话管理

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

会话相关API

Subject.getSession():获取会话,等价于 Subject.getSession(true),即如果当前没有创建 session 对象会创建一个;Subject.getSession(false),如果当前没有创建 session 对象则返回 null。
session.getId():获取当前会话的唯一标识。
session.setAttribute(key,val) :设置会话属性。
session.getAttribute(key) :获取会话属性。
session.removeAttribute(key):删除会话属性。
SessionDAO
Shiro 提供 SessionDao 用于会话持久化。提供 CRUD 操作。

AbstractSessionDAO 提供了 SessionDAO 的基础实现,如生成会话 ID 等。
CachingSessionDAO 提供了对开发者透明的会话缓存的功能,需要设置相应的 CacheManager。
MemorySessionDAO 直接在内存中进行会话维护。
EnterpriseCacheSessionDAO 提供了缓存功能的会话维护,默认情况下使用 MapCache 实现,内部使用 ConcurrentHashMap 保存缓存的会话。
在实际开发中,如果要用到 SessionDAO 组件,可以自定义类实现自 EnterpriseCacheSessionDAO 类,为其注入 sessionIdGenerator 属性,如果用到缓存的话还可以注入一个缓存的名字。最后将这个 SesionDAO 组件注入给 SessionManager(会话管理器),最后将 SessionManager 配置给 SecurityManager。会话使用
建议在开发中,Controller 层使用原生的 HttpSession 对象,在 Service 层中使用 Shiro 提供的 Session 对象。如果在 Service 层中使用 HttpSession 对象,那么属于侵入式,并不建议这么做。Shiro 提供的 Session 能够很好的解决这个问题。那么,问题来了,两种方式获取的 session 是否相同呢?在 Controller 中,通过 request.getSession() 获取会话 session ,该 session 到底来源于ServletRequest 还是由 Shiro 管理并创建的会话,主要由安全管理器 SecurityManager 和SessionManager 会话管理器决定。在使用默认 SessionManager 会话管理器的情况下,不管是通过 request.getSession() 或者 subject.getSession() 获取到 session,操作 session,两者都是等价的,请大家放心使用!

<think>好的,我现在需要帮助用户了解Apache Shiro会话管理机制,并提供教程配置示例。首先,我得回顾一下用户的问题相关引用内容。用户明确提到了会话管理,所以需要聚焦在Shiro的SessionManagement部分。根据引用[3],Shiro会话管理通过SessionDAO实现持久化,支持不同存储介质,比如内存、数据库、分布式缓存等。用户可能需要知道如何配置这些SessionDAO,以及具体的配置步骤。另外,引用[5]提到了Shiro.ini文件配置示例,里面涉及用户、角色URL过滤规则,可能与会话管理相关,比如会话超时设置。 接下来,我应该先解释Shiro会话管理的基本概念,比如与HttpSession的区别,Shiro提供的统一API,然后介绍核心组件,如SessionManagerSessionDAO。需要说明SessionDAO的不同实现,比如MemorySessionDAO、EnterpriseCacheSessionDAO,以及如何配置它们。 然后,用户可能需要具体的配置示例。例如,在Shiro.ini中如何设置会话超时,或者在SpringBoot中如何集成。引用[5]中的动态URL配置部分提到了FilterChainDefinitionMapLoader,这可能与会话管理的权限控制有关联,但需要明确区分会话管理权限配置的不同。另外,用户可能需要了解如何自定义会话存储,比如使用Redis或数据库。这里需要给出代码示例,比如配置RedisSessionDAO,并添加相关依赖。同时,要注意引用中的信息是否正确,比如引用[3]提到的SessionDAO类型,需要确认Shiro的文档是否支持这些实现。还需要考虑会话的生命周期管理,比如创建、获取、销毁会话,以及如何设置全局超时时间。引用[5]中的.ini配置示例中的[main]部分可能涉及SessionManager的配置,比如设置sessionManager的globalSessionTimeout属性。 在教程部分,应该分步骤说明如何配置会话管理,从基础配置到高级存储方案。可能还需要提到加密部分,因为引用[3][4]提到了加密功能,但用户的问题主要集中在会话管理,所以可以简要带过。最后,生成相关问题,帮助用户深入理解。比如会话超时配置、分布式会话的实现、SessionDAO的选择等。确保问题与内容相关,并引导用户进一步探索。 需要验证所有配置示例的准确性,比如检查Shiro的官方文档确认SessionDAO的配置方式,以及Spring Boot集成步骤是否正确。同时,确保LaTeX格式正确,数学公式用$...$,但这里可能用不上数学公式,更多的是代码块配置示例。 总结,回答结构应该是:概述会话管理机制,核心组件,配置示例(包括基础、高级、SpringBoot集成),代码示例,以及相关问题。确保引用正确,比如引用[3][5]中的相关内容,并在适当的位置添加引用标识。</think>### Apache Shiro 会话管理机制详解 #### 一、会话管理核心机制 Apache Shiro会话管理支持跨多种环境(如 Web、非 Web)的统一 API,**无需依赖容器**即可实现会话生命周期控制。其核心组件包括: 1. **SessionManager**:负责会话创建、维护销毁 2. **SessionDAO**:实现会话持久化存储的接口,支持多种存储介质[^3] 3. **SessionValidationScheduler**:会话过期检测机制 常见 SessionDAO 实现类型: - `MemorySessionDAO`(默认内存存储) - `EnterpriseCacheSessionDAO`(基于缓存实现) - `JdbcSessionDAO`(数据库存储) - `RedisSessionDAO`(分布式缓存) #### 二、基础配置示例 在 `shiro.ini` 中配置会话管理: ```ini [main] # 配置会话超时(单位:毫秒) securityManager.sessionManager.globalSessionTimeout = 1800000 # 30分钟 # 使用缓存存储会话 sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO ``` #### 三、高级存储配置 **Redis 会话存储示例**: 1. 添加依赖: ```xml <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>3.3.1</version> </dependency> ``` 2. 配置 SessionDAO: ```java @Bean public RedisSessionDAO redisSessionDAO() { RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); redisSessionDAO.setRedisManager(redisManager()); redisSessionDAO.setExpire(1800); // 设置过期时间(秒) return redisSessionDAO; } ``` #### 四、会话操作 API ```java // 获取当前会话 Session session = SecurityUtils.getSubject().getSession(); // 设置会话属性 session.setAttribute("userProfile", userProfile); // 强制会话过期 session.stop(); ``` #### 五、Spring Boot 集成配置 ```yaml shiro: session: enable: true storageEnabled: true timeout: 1800 # 全局会话超时(秒) redis: host: redis://localhost:6379 ``` #### 六、会话生命周期控制 $$ sessionTimeout = \frac{GlobalSessionTimeout}{ActiveSessionCount} $$ 通过动态调整公式参数实现资源优化分配[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值