Мы знаем, что Широ управляет Session через SessionManager, и операция сеанса реализована через SessionDao. По умолчанию Широ реализует два SessionDao, а именно CachingSessionDao и MemorysessionDao. Когда мы используем кэш ehcache, мы используем CachingsessessionDao. Если кэш не применим, мы выберем на основе памяти SessionDao. Поэтому, если мы хотим реализовать распределенное обмен сеансами на основе REDIS, основное внимание уделяется переписыванию SessionDao в SessionManager. Наш код переписывания следующим образом:
пакет com.chhliu.springboot.shiro.cache; импортировать java.io.serializable; Импорт java.util.collection; импортировать java.util.concurrent.timeUnit; Импорт org.apache.shiro.session.session; Импорт org.apache.shiro.session.unknownsessionException; Импорт 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"}) открытый класс SurvessessionDao ExtrableSsessionDao {// Время времени аута сеанса, единица - миллисекунды частного долгого времени = 120000; @Autowired private redistemplate Redistemplate; // Redis Operation Class, если вы не знакомы с этим, вы можете обратиться к предыдущему блогу public redissessionDao () {super (); } public redissessionDao (Long ExpitureTime, Redistemplate Redistemplate) {super (); это. this.redistemplate = redistemplate; } @Override // Обновление сессии public void Update (сеанс сеанса) бросает неизвестный System.out.println ("=================================================================================================== ========================================================================================= ========================================================================================= ========================================================================================= session.getid () == null) {return; System.out.println ("=================================================================================================== ========================================================================================== ========================================================================================== ========================================================================================== redistemplate.opsforvalue (). getOperations (). Delete (Session.getId ()); getActivessessions () { System.out.println ("================================================================================ ========================================================================================== ========================================================================================== ========================================================================================== redistemplate.keys ("*"); System.out.println ("========================================================================================================= ===================================================================== ===================================================================== ===================================================================== ===================================================================== ===================================================================== ====================================================================== TimeUnit.milliseconds); System.out.println ("======================================================================================== ==================================================================== ==================================================================== ==================================================================== ==================================================================== ==================================================================== ===================================================================== } public void setExpireTime (long extireTime) {this.expiretime = expiration; После реализации SessionDao нам нужно добавить SessionDao в SessionManager. Код заключается в следующем:
@Bean Public DefaultWebsessionManager configWebsessionManager () {defaultWebsessionManager Manager = новый DefaultWebsessionManager (); Manager.setCachEmanager (CachEmanager); // Присоединяйтесь к Cache Manager Manager.setSessionDao (SessionDAO); // SET SESSIONDAO Manager.SetDeleteInvalidsessions (true); // DEDET Manager.setSessionValidationsCheduleRenabled (true); // Проверка верхового менеджера сеанса. } Последний шаг - настройка SessionManager на SecurityManager
@Bean Public SecurityManager SecurityManager (DefaultWebsessionManager WebSessionManager) {DefaultWebsecurityManager SecurityManager = New DefaultWebsecurityManager (); // установить царство. SecurityManager.SetRealm (myshiRoreAlm ()); // Inject Cache Manager; SecurityManager.SetCachEmanager (CacheManager); // Если это выполняется несколько раз, это один и тот же объект; // менеджер сессий SecurityManager.setSessionManager (WebSessionManager); // Inject Помните моего менеджера; SecurityManager.SetRememberMemanager (momplyMemanager ()); Return SecurityManager; } Результаты теста следующие:
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
==================================================================
=================== Doreadsession ====================
=================== Doreadsession ====================
==================================================================
=================== Doreadsession ====================
=================== Doreadsession ====================
=================== Doreadsession ====================
Конфигурация разрешения -> MyshiRorealM.DogetAuthorizationInfo ()
=================== Doreadsession ====================
Мы обнаружим, что когда на странице существует несколько ресурсов, методы Doreadsession и обновление будут постоянно вызваны для чтения и обновления сеансов. В настоящее время для этой проблемы не было найдено лучшего решения.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.