shiro安全框架擴充套件教程–異常退出沒有清除快取資訊處理方案
自從之前研究了security3一段時間,發現也不咋滴,後來轉行去玩玩shiro,感覺還是挺不錯的,小巧靈活;然後遇到個大家都應該遇到過的問題就是當使用者退出或者異常關閉瀏覽器的時候不會自動清除快取授權資訊,當然shiro是有個玩意會自動掃描過期的會話,但是它只會清除會話資訊不會清除cache裡面的資訊,看了網上的答案都是不靠譜的,最好還是自己看原始碼吧,下面看我的解決方案
<!-- 預設會話管理器 --> <bean id="sessionManager" class="com.shadow.shiro.extend.session.impl.SimpleWebSessionManager"> <property name="globalSessionTimeout" value="15000" /> <property name="sessionValidationInterval" value="30000" /> <property name="sessionValidationSchedulerEnabled" value="true" /> </bean>
全域性的會話資訊設定成15秒,檢測掃描資訊間隔30秒,第三個引數就是是否開啟掃描
至於我的sessionManager實現類是自己繼承,然後重寫了其中一個方法
package com.shadow.shiro.extend.session.impl; import java.util.Collection; import java.util.Iterator; import org.apache.log4j.Logger; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.session.ExpiredSessionException; import org.apache.shiro.session.InvalidSessionException; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.DefaultSessionKey; import org.apache.shiro.session.mgt.SessionKey; import org.apache.shiro.session.mgt.SimpleSession; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import com.shadow.shiro.extend.session.WebSessionManager; /** * 會話管理器 * * @author shadow * */ public class SimpleWebSessionManager extends DefaultWebSessionManager implements WebSessionManager { private CacheManager cacheManager; private final static Logger logger = Logger .getLogger(SimpleWebSessionManager.class); public SimpleWebSessionManager() { super(); } public void validateSessions() { if (logger.isInfoEnabled()) logger.info("Validating all active sessions..."); int invalidCount = 0; Collection<?> activeSessions = getActiveSessions(); if (activeSessions != null && !activeSessions.isEmpty()) { for (Iterator<?> i$ = activeSessions.iterator(); i$.hasNext();) { Session session = (Session) i$.next(); try { SessionKey key = new DefaultSessionKey(session.getId()); validate(session, key); } catch (InvalidSessionException e) { if (cacheManager != null) { SimpleSession s = (SimpleSession) session; if (s.getAttribute(SESSION_USER_KEY) != null) cacheManager.getCache(null).remove( s.getAttribute(SESSION_USER_KEY)); } if (logger.isDebugEnabled()) { boolean expired = e instanceof ExpiredSessionException; String msg = (new StringBuilder()).append( "Invalidated session with id [").append( session.getId()).append("]").append( expired ? " (expired)" : " (stopped)") .toString(); logger.debug(msg); } invalidCount++; } } } if (logger.isInfoEnabled()) { String msg = "Finished session validation."; if (invalidCount > 0) msg = (new StringBuilder()).append(msg).append(" [").append( invalidCount).append("] sessions were stopped.") .toString(); else msg = (new StringBuilder()).append(msg).append( " No sessions were stopped.").toString(); logger.info(msg); } } public void setCacheManager(CacheManager cacheManager) { this.cacheManager = cacheManager; } }
其中這裡的方法是校驗會話的,我在方法上加入了cachemanager的介面,然後重寫set方法,就能獲得例項,然後在執行期間呼叫cache.remove()方法,就能清空快取上的資訊了;
相關文章
- nodejs程式異常退出處理方法NodeJS
- 3大問題!Redis快取異常及處理方案總結Redis快取
- 解決“當前擴充套件快取策略沒有進行註冊”的錯誤套件快取
- 異常錯誤資訊處理
- 自動化時序異常檢測的可擴充套件通用框架套件框架
- hibernate跨資料庫,json欄位處理方案,自定義擴充套件JsonStringType資料庫JSON套件
- PHP 7.3.8 安裝 ext-Redis 擴充套件 報錯處理方案PHPRedis套件
- SpringCloudGateway資料庫儲存路由資訊的擴充套件方案SpringGCCloudGateway資料庫路由套件
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- 異常篇——異常處理
- 優雅的處理Spring Boot異常資訊Spring Boot
- Java入門教程十一(異常處理)Java
- Redis 快取常見問題處理Redis快取
- Java培訓簡述如何處理沒有被捕獲的異常Java
- 異常處理
- 圖片處理擴充套件 Grafika 的簡單使用套件
- 基於Gin框架實現異常處理框架
- Redis快取篇(四)快取異常Redis快取
- Redis快取的主要異常及解決方案Redis快取
- 異常-JDK7針對多個異常的處理方案JDK
- Spring Cloud Gateway 資料庫儲存路由資訊的擴充套件方案SpringCloudGateway資料庫路由套件
- Abp vNext異常處理的缺陷/改造方案
- Flutter 異常處理方案——灰度與降級Flutter
- 基於shiro的自定義註解的擴充套件套件
- Python 簡明教程 --- 23,Python 異常處理Python
- java安全編碼指南之:異常處理Java
- AbpVnext使用分散式IDistributedCache Redis快取(自定義擴充套件方法)分散式Redis快取套件
- JSP 異常處理如何處理?JS
- 圖片處理擴充套件 Intervention/image 的簡單使用套件
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- 異常-throws的方式處理異常
- Util應用框架基礎(五) - 異常處理框架
- 什麼是異常?python處理異常的方式有幾種?Python
- 安裝Swoole框架和擴充套件框架套件
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 異常的處理
- golang - 異常處理Golang
- 異常處理2