服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 解决shiro 定时监听器不生效的问题 onExpiration不调用问题

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

2021-10-27 11:04Mitnickl Java教程

这篇文章主要介绍了解决shiro 定时监听器不生效的问题 onExpiration不调用问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

问题

redis 抛出异常:

 redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; Method threw 'java.lang.NoSuchMethodError' exception. 

说明

spring-boot 版本

  org.springframework.bootspring-boot-starter-parent2.4.5

shiro-redis版本

  org.crazycakeshiro-redis3.2.3

jedis版本

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

shiro设置定时检测session失效

shiro配置session失效时间,没有引用shiro-quartz ,采用默认的

 ExecutorServiceSessionValidationScheduler

shiro 配置

 @Bean public SessionManager sessionManager(SimpleCookie simpleCookie, SessionDAO sessionDAO) { logger.debug("安全框架配置:开始sessionManager配置"); SkySessionManager skySessionManager = new SkySessionManager(); skySessionManager.setSessionDAO(sessionDAO); skySessionManager.setSessionIdCookie(simpleCookie); // 开启cookie skySessionManager.setSessionIdCookieEnabled(true); // session 失效删除session skySessionManager.setDeleteInvalidSessions(true); // 定期检查 失效的 session skySessionManager.setSessionValidationInterval(10000); // 开启 schedule skySessionManager.setSessionValidationSchedulerEnabled(true); ​ skySessionManager.setSessionListeners(Collections.singletonList(new SkySessionListener())); logger.debug("安全框架配置:结束sessionManager配置"); return skySessionManager; }

shiro schedule 创建逻辑

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

问题出现点

当创建完默认的scheduler 后会执行一次 run方法。

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

继续跟踪代码

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

发现 此处有异常,但是异常并未被捕获,导致线程中断。

网上百度此异常 说是,jedis版本不一致导致。

解决方案

查看shiro-redis pom文件jedis的版本号。

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

发现jedis版本号为2.9.0

将jedis 2.9.0 集成进项目:

  redis.clientsjedis2.9.0

至此问题解决。

 @Override public void onExpiration(Session session)

onExpiration 方法不调用的问题, 此方法是通过上面的定时任务提醒来进行触发的。

解决shiro 定时监听器不生效的问题 onExpiration不调用问题

由于,redis 和ehcache 本身设置了过期时间,过期之后 session 变从 redis 后者ehcache 里面删除,因此 onExpiration 过期之后此方法 永远不会被调用到。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/ningxuezhu/article/details/118965610

延伸 · 阅读

精彩推荐