Shiro는 SessionManager를 통해 세션을 관리하며 세션 운영은 SessionDao를 통해 구현됩니다. 기본적으로 Shiro는 CachingsessionDao와 MemorySessionDao의 두 SessionDao를 구현합니다. Ehcache 캐시를 사용하면 CachingsessionDao를 사용합니다. 캐시가 적용되지 않으면 메모리 기반 SessionDao를 선택합니다. 따라서 Redis를 기반으로 분산 세션 공유를 구현하려면 SessionManager에서 SessionDao를 다시 작성하는 데 중점을 둡니다. 우리의 재 작성 코드는 다음과 같습니다.
패키지 com.chhliu.springboot.shiro.cache; java.io.serializable import; java.util.collection import; java.util.concurrent.timeUnit import; import org.apache.shiro.session.session; import org.apache.shiro.session.unknownsessionException; import org.apache.shiro.session.mgt.eis.abstractsessiondao; org.springframework.beans.factory.annotation.autowired; org.springframework.data.redis.core.redistemplate; org.springframework.steretype.service; @Service @suppresswarnings ({ "rawtypes", "unchecked"}) public class redissessiondao abstractsessiondao {// 세션 시간 초과 시간, 단위는 밀리 초 비공개 긴 만기 = 120000; @autowired private redistemplate redistemplate; // redis operation class, 이것에 익숙하지 않은 경우 이전 블로그 public redissessiondao () {super (); } public redissessiondao (긴 만기, Redistemplate redistemplate) {super (); this.expiretime = e. this.redistemplate = redistemplate; } @override // 업데이트 세션 공개 무효 업데이트 (세션 세션) unknownsessionException { System.out.println ( "=============================================================================================================================== =============================================================================================================== =============================================================================================================== =============================================================================================================== session.getid () == null) {return} settimeout (expiretime); System.out.println ( "=================================================================================================================================== ======================================================================================================================= ===================================================================================================================================== ======================================================================================================================= redistemplate.opsforValue (). getOperations (). 삭제 (session.getId ()); getActiveSessions () { System.out.println ( "===================================================================================================================================== ========================================================================================================================================= ========================================================================================================================================= ========================================================================================================================================= redistemplate.keys ( "*") @atederide // 세션에 가입하는 직렬화 가능한 docreate (세션 세션) { System.out.println ( "=================================================================================================================== ================================================================= ================================================================= ================================================================= ================================================================= ================================================================= =================================================================== TimeUnit.milliseconds); System.out.println ( "=========================================================================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ================================================================= } public void setexpiretime (legpiretime) {expiretime = lecongeplate getRedistemplate (return redistemplate) {redistemplate redistemplate; SessionDao가 구현되면 SessionDao를 SessionManager에 추가해야합니다. 코드는 다음과 같습니다.
@bean public defaultwebsessionmanager configwebsessionmanager () {defaultWebsessionManager Manager = 새 DefaultWebsessionManager (); Manager.SetCacheManager (CACHEMANAGER); // CACHE MANAGER MANAGEN.SESSESSIONDAO (SessionDAO); // SET SECTDAO Manager.SetDeleteInValidSessions (true); // 만료 된 Session Manager.setGlobalSessionTimeout (sessionDao.getexpiretime ()); Manager.SetSessionValidationSchedulerEnabled (true); // Session Return Manager를 확인하십시오. } 마지막 단계는 SessionManager를 SecurityManager로 구성하는 것입니다
@Bean Public SecurityManager SecurityManager (DefaultWebsessionManager WebSessionManager) {DefaultWebSecurityManager SecurityManager = 새 DefaultWebseCurityManager (); // 영역을 설정합니다. SecurityManager.setRealm (myshirorealm ()); // 캐시 관리자를 주입합니다. SecurityManager.setCacheManager (Cachemanager); // 이것이 여러 번 실행되면 동일한 객체입니다. // 세션 관리자 SecurityManager.SetSessionManager (WebsessionManager); // 내 관리자를 기억하십시오. SecurityManager.setRememberMemanager (RememberMemanager ()); 반품 보안 관리자; } 테스트 결과는 다음과 같습니다.
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
========================================
=================== Doreadsession ======================
=================== Doreadsession ======================
========================================
=================== Doreadsession ======================
=================== Doreadsession ======================
=================== Doreadsession ======================
권한 구성 -> myshirorealm.dogetauthorizationInfo ()
=================== Doreadsession ======================
페이지에 여러 리소스가 존재하면 Doreadsession 및 업데이트 방법이 지속적으로 호출되어 세션을 읽고 업데이트합니다. 현재이 문제에 대한 더 나은 솔루션은 발견되지 않았습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.