Sabemos que Shiro gerencia a sessão através da SessionManager, e a operação da sessão é implementada através da SessionDao. Por padrão, Shiro implementa dois sessões, ou seja, CachingsessionDao e MemorySessionDao. Quando usamos o Ehcache Cache, usamos o CachingsessionDao. Se o cache não for aplicável, escolheremos o SessionDao baseado em memória. Portanto, se queremos implementar o compartilhamento de sessões distribuídas com base no Redis, o foco está em reescrever o SessionDao no SessionManager. Nosso código de reescrita é o seguinte:
pacote com.chhliu.springboot.shiro.cache; importar java.io.serializable; importar java.util.Collection; importar 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 @SUPletSwarnings ({"RawTypes", "desmarcado"}) classe public RedissessionDao estende abstrateSessionDao {// Tempo limite da sessão, a unidade é milissegundos privados long expireTime = 120000; @Autowired Private Redistemplate Redistemplate; // Classe de operação Redis, se você não estiver familiarizado com isso, pode consultar o blog anterior public redissessionDao () {super (); } public redissessionDao (longo tempo, Redistemplate redistemplate) {super (); this.expireTime = expireTime; this.redistemplate = redistemplate; } @Override // Atualizar sessão public void update (sessão de sessão) lança UNKNENWYSESSESHECCECTION { System.out.println("===================================================================================== ========================================================================================================= ========================================================================================================= ========================================================================================================= session.getId () == NULL) {return; System.out.println("====================================================================================== =========================================================================================================== ========================================================================================================== =========================================================================================================== Redistemplate.OpsForValue (). Getoperation (). Delete (session.getId ()); getActiveSessions () { System.out.println ("=========================================================================================================== ================================================================================================== ================================================================================================== ================================================================================================== redistemplate.keys ("*"); System.out.println("==================================================================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== =============================================================== TimeUnit.MillisEconds); System.out.println("================================================================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== } public void se setExpireTime (longa expectativa) {this.expiretime = expireTime; Após a implementação de sessões, precisamos adicionar sessões ao SessionManager. O código é o seguinte:
@Bean Public DefaultWebSessionManager ConfigWebSessionManager () {DefaultWebSessionManager Manager = new DefaultWebSessionManager (); gerente.setCachemanager (Cachemanager); // ingressar no Cache Manager Manager.SetSessionDao (sessionDao); // Definir sessionDao Manager.SetDeleteInValidSessions (true); // excluir a sessão vencida. gerenciador.SetSessionValidationsCheduleRenabled (true); // Verifique o gerenciador de retorno da sessão em nenhum momento; } O último passo é configurar a sessão do SecurityManager
@Bean Public SecurityManager SecurityManager (DefaultWebSessionManager WebSessionManager) {DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager (); // Defina o reino. SecurityManager.SetRealM (myshirorealm ()); // injetar gerenciador de cache; SecurityManager.SetCachemanager (Cachemanager); // Se isso for executado várias vezes, será o mesmo objeto; // Session Manager SecurityManager.SetSessionManager (WebSessionManager); // injetar lembre -se do meu gerente; SecurityManager.SetRememberMemanager (RECKMEMANAGER ()); Retornar SecurityManager; } Os resultados dos testes são os seguintes:
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
==========================================
===================== DoreadSession ======================
===================== DoreadSession ======================
==========================================
===================== DoreadSession ======================
===================== DoreadSession ======================
===================== DoreadSession ======================
Configuração de permissão -> myshiroreal.DogEtauthorizationInfo ()
===================== DoreadSession ======================
Descobriremos que, quando vários recursos existirem em uma página, os métodos DOREADSession e atualização serão chamados constantemente para ler e atualizar sessões. No momento, nenhuma solução melhor foi encontrada para esse problema.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.