shiro自定义session过期时间

本文详细介绍了如何在使用Shiro权限框架的同时,利用Redis管理session,通过设置90分钟的全局会话时间和存储过期时间,确保了会话管理的高效性和安全性。

使用shiro权限框架,并使用redis来管理session时,自定义session有效时间,配置如下:

1:sessionManager.setGlobalSessionTimeout(90*60*1000);

2: redisSessionDAO.setExpire(90*60);

如上两个时间一个是session会话时间,一个是redis存储的session的有效时间。

其它处的session配置时效都不用管,以上面两个配置为最终决定session有效期。

自定义 ShiroSession 管理的具体步骤如下: 1. **实现 SessionDAO 接口**:SessionDAO 用于会话的 CRUD(创建、读取、更新、删除)操作,可自定义会话的存储持久化逻辑。Shiro 提供了多种 SessionDAO 实现,如 MemorySessionDAO、CachingSessionDAO 等,可根据需求选择合适的实现类进行扩展。例如,若要将会话信息存储到 Redis 中,可自定义实现 RedisSessionDao,将登录过程的用户信息、数据库的权限菜单等 session 信息等放到 Redis 缓存中[^2][^4]。 ```java import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.SessionDAO; import java.io.Serializable; import java.util.Collection; public class CustomSessionDAO implements SessionDAO { @Override public Serializable create(Session session) { // 实现会话创建逻辑 return null; } @Override public Session readSession(Serializable sessionId) { // 实现会话读取逻辑 return null; } @Override public void update(Session session) { // 实现会话更新逻辑 } @Override public void delete(Session session) { // 实现会话删除逻辑 } @Override public Collection<Session> getActiveSessions() { // 实现获取活跃会话逻辑 return null; } } ``` 2. **配置 SessionManager**:SessionManager 是会话管理的核心组件,管理着所有 Subject 的会话。Shiro 提供了多种会话管理器实现,如 DefaultSessionManager 用于 JavaSE 环境,ServletContainerSessionManager 用于 Web 环境并直接使用 Servlet 容器的会话,而 DefaultWebSessionManager 则用于 Web 环境并自己维护会话(废弃了 Servlet 容器的会话管理)。可根据应用场景选择合适的 SessionManager 并配置自定义SessionDAO[^2]。 ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public CustomSessionDAO customSessionDAO() { return new CustomSessionDAO(); } @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionDAO(customSessionDAO()); return sessionManager; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setSessionManager(sessionManager()); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); return shiroFilterFactoryBean; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 配置过滤规则 chainDefinition.addPathDefinition("/**", "authc"); return chainDefinition; } } ``` 3. **实现 SessionListener(可选)**:Shiro 提供了 SessionListener 接口,用于监听会话的创建、过期销毁事件。可实现该接口或继承 SessionListenerAdapter 类,重写指定方法来自定义会话监听逻辑[^2]。 ```java import org.apache.shiro.session.Session; import org.apache.shiro.session.SessionListener; public class CustomSessionListener implements SessionListener { @Override public void onStart(Session session) { // 会话创建时的逻辑 } @Override public void onStop(Session session) { // 会话停止时的逻辑 } @Override public void onExpiration(Session session) { // 会话过期时的逻辑 } } ``` 并在 SessionManager 中配置该监听器: ```java @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionDAO(customSessionDAO()); sessionManager.getSessionListeners().add(new CustomSessionListener()); return sessionManager; } ``` 4. **配置 SessionValidationScheduler(可选)**:Shiro 提供了会话验证调度器(SessionValidationScheduler),用于定期验证会话是否已过期。如果会话过期,将停止会话。Shiro 默认提供了基于线程池的 ExecutorServiceSessionValidationScheduler 基于 Quartz 的 QuartzSessionValidationScheduler 两种实现。可根据需求选择合适的调度器并在 SessionManager 中配置[^2]。 ```java import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler; import org.apache.shiro.session.mgt.SessionValidationScheduler; @Bean public SessionValidationScheduler sessionValidationScheduler() { ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler(); scheduler.setInterval(1800000); // 设置验证间隔时间 return scheduler; } @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionDAO(customSessionDAO()); sessionManager.setSessionValidationScheduler(sessionValidationScheduler()); sessionManager.setSessionValidationSchedulerEnabled(true); return sessionManager; } ``` ### 注意事项 - **线程安全**:在实现 SessionDAO SessionListener 时,要确保代码是线程安全的,因为这些组件可能会在多线程环境下被调用。 - **异常处理**:在自定义SessionDAO 中,对数据库或缓存的操作可能会抛出异常,需要进行适当的异常处理,避免影响系统的稳定性。 - **性能考虑**:自定义Session 管理可能会对系统性能产生影响,例如频繁的读写操作。因此,需要对性能进行测试优化,如使用缓存来提高读写效率。 - **兼容性**:确保自定义Session 管理与 Shiro 框架以及其他相关组件的版本兼容,避免出现兼容性问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值