Sabemos que Shiro administra Session a SessionManager, y el funcionamiento de la sesión se implementa a través de SessionDAO. Por defecto, Shiro implementa dos sessiondao, a saber, CachingsessionDao y MemoriaSessiondao. Cuando usamos Ehcache Cache, usamos CachingsessionDao. Si el caché no es aplicable, elegiremos SessionDAO basado en memoria. Por lo tanto, si queremos implementar el intercambio de sesión distribuido basado en Redis, el enfoque está en reescribir sessiondao en SessionManager. Nuestro código de reescritura es el siguiente:
paquete com.chhliu.springboot.shiro.cache; import java.io.serializable; import java.util.collection; import java.util.concurrent.timeunit; importar org.apache.shiro.session.session; importar org.apache.shiro.session.unknownsessionException; importar org.apache.shiro.session.mgt.eis.abstractsessiondao; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.data.redis.core.redistemplate; importar org.springframework.steretype.service; @Service @SupessWarnings ({"RawTypes", "sin control"}) Public Class RedissessionDao extiende AbstractSessionDao {// Tiempo de espera de sesión, la unidad es milisegundos privado largo vencido = 120000; @AutoWired private redistemplate redistemplate; // Redis Class de operación, si no está familiarizado con esto, puede consultar el blog Public RedissessionDao () {super (); } public RedissessionDao (Long Expertime, redistemplate redistemplate) {super (); this.expireTime = expireTime; this.redistemplate = redistemplate; } @Override // Actualización publicitaria de la sesión de la sesión (sesión de sesión) lanza unycksessionException { System.out.println("===================================================================================== ==================================================================================================================================================================================================================================================================================================. ==================================================================================================================================================================================================================================================================================================. ==================================================================================================================================================================================================================================================================================================. session.getId () == null) {return; System.out.println("====================================================================================== =========================================================================================================== ========================================================================================================== =========================================================================================================== redistemplate.opsforvalue (). getOperations (). delete (session.getID ()); getActiveSesions () { System.out.println ("================================================================================= ====================================================================================================================================================================== ¡ ====================================================================================================================================================================== ¡ ====================================================================================================================================================================== ¡ redistemplate.keys ("*"); System.out.println("==================================================================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ================================================================ TimeUnit.milliseConds); System.out.println("================================================================================================== ============================================================= ============================================================= ============================================================= ============================================================= ============================================================= ============================================================== } public void setExpireTime (Long Expertime) {this.expireTime = expireTime; Después de implementar SessionDAO, necesitamos agregar SessionDAO a SessionManager. El código es el siguiente:
@Bean Public DefaultWebSessionManager configShebSessionManager () {defaultWebSessionManager Manager = new DefaultWebSessionManager (); gerente.setCachemanager (Cachemanager); // Únase al gerente de caché gerente.setsessiondao (sessionDao); // establecer sessiondao gerente.setDeleteInvalidSessions (true); // Eliminar administrador de sesión expirado. gerente.setsessionValidationsChedulerEnabled (true); // Verifique el administrador de retorno de la sesión en ningún momento; } El último paso es configurar SessionManager en SecurityManager
@Bean Public SecurityManager SecurityManager (defaultWebSessionManager WebSessionManager) {defaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager (); // Establecer reino. SecurityManager.SetRealm (myShireRealm ()); // Inyect Cache Manager; SecurityManager.SetCachemanager (Cachemanager); // Si esto se ejecuta varias veces, es el mismo objeto; // Session Manager SecurityManager.SetSessionManager (WebSessionManager); // inyectar recuerde a mi gerente; SecurityManager.SetRememberManager (RememberMemanager ()); return SecurityManager; } Los resultados de la prueba son los siguientes:
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
==========================================
==================== Doreadsession =======================
==================== Doreadsession =======================
==========================================
==================== Doreadsession =======================
==================== Doreadsession =======================
==================== Doreadsession =======================
Configuración de permiso -> myshirorealm.dogetautorizationInfo ()
==================== Doreadsession =======================
Encontraremos que cuando existan múltiples recursos en una página, los métodos de doreadsession y actualización se llamarán constantemente para leer y actualizar sesiones. En la actualidad, no se ha encontrado una mejor solución para este problema.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.