解決shiro 定時監聽器不生效的問題 onExpiration不調用問題
問題
redis 拋出異常:
redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; Method threw 'java.lang.NoSuchMethodError' exception.
說明
spring-boot 版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent>
shiro-redis版本
<dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>3.2.3</version> </dependency>
jedis版本
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 創建邏輯
問題出現點
當創建完默認的scheduler 後會執行一次 run方法。
繼續跟蹤代碼
發現 此處有異常,但是異常並未被捕獲,導致線程中斷。
網上百度此異常 說是,jedis版本不一致導致。
解決方案
查看shiro-redis pom文件jedis的版本號。
發現jedis版本號為2.9.0
將jedis 2.9.0 集成進項目:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
至此問題解決。
@Override public void onExpiration(Session session)
onExpiration 方法不調用的問題, 此方法是通過上面的定時任務提醒來進行觸發的。
由於,redis 和ehcache 本身設置瞭過期時間,過期之後 session 變從 redis 後者ehcache 裡面刪除,因此 onExpiration 過期之後此方法 永遠不會被調用到。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Redis快速實現分佈式session的方法詳解
- 教你怎麼用Java操作Redis
- Java使用Redis及其優化詳解
- SpringBoot集成Redis並實現主從架構的實踐
- springboot使用redis實現從配置到實戰