Nous savons que Shiro gère la session via SessionManager et que le fonctionnement de la session est implémenté via SessionDao. Par défaut, Shiro implémente deux SessionDAO, à savoir CachingSessionDao et MemorySessionDao. Lorsque nous utilisons le cache ehcache, nous utilisons CachingSessionDao. Si le cache n'est pas applicable, nous choisirons SessionDAO basés sur la mémoire. Par conséquent, si nous voulons implémenter le partage de session distribué basé sur Redis, l'accent est mis sur la réécriture de SessionDao dans SessionManager. Notre code de réécriture est le suivant:
package com.chhliu.springboot.shiro.cache; import java.io.serializable; import java.util.collection; Importer java.util.concurrent.TimeUnit; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnkNownSessionException; import org.apache.shiro.session.mgt.eis.abstractSessionDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.redistemplate; import org.springframework.steretype.service; @Service @SuppressWarnings ({"RawTypes", "Unchecked"}) la classe publique Redessessedao étend AbstractSessionDao {// le temps d'attente de session, l'unité est des millisecondes privées long expiretime = 120000; @Autowired Private ReDistetemplate reidemplate; // Reded Operation Class, si vous n'êtes pas familier avec cela, vous pouvez vous référer au blog précédent Public RedissessionDao () {super (); } Public RedissessionDao (Expiretime longue, Redemplate Redemplate) {super (); this.expiretime = Expiretime; this.redistemplate = reidemplate; } @Override // Update Session Public Void Update (Session Session) lève UnknownSessionException { System.out.println("===================================================================================== ==========================================================================================================. ==========================================================================================================. ==========================================================================================================. Session.getId () == null) {return;} session.settimeout (expiration); System.out.println("====================================================================================== ============================================================================================================. ===========================================================================================================. ============================================================================================================. Redistemplate.opsforvalue (). GetOperations (). Delete (session.getId (); getActivesessions () { System.out.println("============================================================================= =======================================================================================================================. =======================================================================================================================. =======================================================================================================================. redistemplate.keys ("*"); System.out.println("==================================================================================================== =====================================================================. =====================================================================. =====================================================================. =====================================================================. =====================================================================. ======================================================================. TimeUnit.Milliseconds); System.out.println("================================================================================================== =====================================================================. =====================================================================. =====================================================================. =====================================================================. =====================================================================. =====================================================================. } public void setExpiretime (Long Expiretime) {this.expiretime = Expiretime;} public Redemplate Une fois que SessionDao est implémenté, nous devons ajouter SessionDao à SessionManager. Le code est le suivant:
@Bean public DefaultWebSessionManager ConfigWebSessionManager () {DefaultWebSessionManager Manager = new defaultWebSessionManager (); Manager.SetCacheManager (CacheManager); // Rejoignez le Cache Manager Manager.SetSessionDao (SessionDao); // Set Session Manager.SetDeleteInvalidSessions (True); // Delete Expired Session Manager.SetGlobalSpricesSettime Manager.SetSessionValidationsCheDuleReenabled (true); // Vérifiez le gestionnaire de retour de session à aucun moment; } La dernière étape consiste à configurer SessionManager sur SecurityManager
@Bean Public SecurityManager SecurityManager (DefaultWebSessionManager WebSessionManager) {DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager (); // Définit le royaume. SecurityManager.SetRealm (MyshiroreAlm ()); // Inject Cache Manager; SecurityManager.SetCacheManager (CacheManager); // Si cela est exécuté plusieurs fois, c'est le même objet; // Session Manager SecurityManager.SetSessionManager (WebSessionManager); // Inject Rappelez-vous mon manager; SecurityManager.SetRembermeManager (RememberMemanager ()); Retour SecurityManager; } Les résultats des tests sont les suivants:
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
=======================================================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
=======================================================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
==================== DoreadSession ==================.
Configuration d'autorisation -> Myshirorealm.DoGetAuthorizationInfo ()
==================== DoreadSession ==================.
Nous constaterons que lorsque plusieurs ressources existent dans une page, les méthodes DoreAdSession et Updage seront constamment appelées pour lire et mettre à jour les sessions. À l'heure actuelle, aucune meilleure solution n'a été trouvée pour ce problème.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.