解決shiro 定時監(jiān)聽器不生效的問題 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 創(chuàng)建邏輯




問題出現(xiàn)點
當創(chuàng)建完默認的scheduler 后會執(zhí)行一次 run方法。

繼續(xù)跟蹤代碼

發(fā)現(xiàn) 此處有異常,但是異常并未被捕獲,導致線程中斷。
網上百度此異常 說是,jedis版本不一致導致。
解決方案
查看shiro-redis pom文件jedis的版本號。

發(fā)現(xiàn)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 方法不調用的問題, 此方法是通過上面的定時任務提醒來進行觸發(fā)的。

由于,redis 和ehcache 本身設置了過期時間,過期之后 session 變從 redis 后者ehcache 里面刪除,因此 onExpiration 過期之后此方法 永遠不會被調用到。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Java弱引用(WeakReference)的理解與使用
這篇文章主要介紹了Java弱引用(WeakReference)的理解與使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
SpringBoot整合SpringSecurity和JWT的示例
這篇文章主要介紹了SpringBoot整合SpringSecurity和JWT的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
一篇文章帶你使用SpringBoot基于WebSocket的在線群聊實現(xiàn)
這篇文章主要介紹了一篇文章帶你使用SpringBoot基于WebSocket的在線群聊實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
Windows安裝兩個或多個JDK并實現(xiàn)自由切換的方法
最近新接手一個項目,啟動的時候,發(fā)現(xiàn)有些jar和現(xiàn)在正在使用的JDK版本不一致,一直啟動有問題,想著就多裝一個JDK,由于為了保證java的運行環(huán)境和編譯環(huán)境保持一致,就需要我們設置jdk的環(huán)境變量,所以本文給大家介紹了Windows安裝兩個或多個JDK并實現(xiàn)自由切換的方法2025-03-03

