ShiroはSessionManagerを通じてセッションを管理しており、セッションの操作がSessionDaoを通じて実装されていることがわかっています。デフォルトでは、Shiroは2つのSessionDao、すなわちCachingsessionDaoとMemorySessionDaoを実装しています。 ehcacheキャッシュを使用する場合、CachingsessionDaoを使用します。キャッシュが適用されない場合は、メモリベースのSessionDaoを選択します。したがって、Redisに基づいて分散セッション共有を実装したい場合、SessionManagerのSessionDaoの書き換えに焦点が当てられています。書き換えコードは次のとおりです。
パッケージcom.chhliu.springboot.shiro.cache; java.io.serializableをインポートします。 java.util.collectionをインポートします。 java.util.concurrent.timeunitをインポートします。 Import org.apache.shiro.session.session; Import org.apache.shiro.session.unknownSessionException; org.apache.shiro.session.mgt.eis.abstractsessiondaoをインポートします。 Import org.springframework.beans.factory.annotation.autowired; org.springframework.data.redis.core.redistemplateをインポートします。 org.springframework.stertype.serviceをインポートします。 @service @suppresswarnings({"rawTypes"、 "un -checked"})public class redissessiondaoはabstractsessiondaoを拡張します{//セッションタイムアウト時間、ユニットはミリ秒プライベートlong expiaretime = 120000; @autowired private Redistemplate Redistemplate; // Redis操作クラス、これに慣れていない場合は、以前のブログpublic RedissessionDao(){super();を参照できます。 } public RedissessionDao(長期expiretime、Redistemplate Redistemplate){super(); this.expiretime = expiretime; this.redistemplate = redistemplate; } @override //更新セッションpublic void update(セッションセッション)unknownsessionexception { System.out.println( "================================================================================= ========================================================================================= ========================================================================================= ========================================================================================= session.getid()== null){return.settime.opsforvalue()。 System.out.println( "================================================================================ ============================================================================================================================================== ============================================================================================================================================ ============================================================================================================================================== redistemplate.opsforvalue()。delete(session.getid()); getActivesEssions(){ System.out.println( "========================================================================================================= ============================================================================================ ============================================================================================ ============================================================================================ redistemplate.keys( "*"); System.out.println( "======================================================================================================================= ========================================================================== ========================================================================== ========================================================================== ========================================================================== ========================================================================== =============================================================================== TimeUnit.MilliseConds); System.out.println( "==================================================================================================== ========================================================================== ========================================================================== ========================================================================== ========================================================================== ========================================================================== ========================================================================== } public setexpiretime(長いexpiretime){expiretime = public redistemplate(){return redistemplate(redistemplate redistemplate) SessionDaoが実装された後、SessionDaoをSessionManagerに追加する必要があります。コードは次のとおりです。
@bean public defaultwebsessionmanager configwebsessionmanager(){defaultwebsessionmanager manager = new defaultwebsessionmanager(); Manager.setCacheManager(CacheManager); // Cache Manager Manager Manager.SetsessionDao(SessionDao) Manager.SetsessionValidationSchedulerEnabled(true); //セッション返品マネージャーを一度にチェックしないでください。 }最後のステップは、SessionManagerをSecurityManagerに構成することです
@Bean Public SecurityManager SecurityManager(defaultWebsessionManager websessionManager){defaultwebsecuritymanager securitymanager = new defaultwebsecuritymanager(); // Realmを設定します。 securitymanager.setrealm(myshirorealm()); //キャッシュマネージャーを注入します。 SecurityManager.setCacheManager(CacheManager); //これが複数回実行される場合、それは同じオブジェクトです。 //セッションマネージャーSecurityManager.SetsessionManager(WebsessionManager); //注入マネージャーを覚えておいてください。 SecurityManager.setRememberMemanager(remembermemanager()); Return SecurityManager; }テスト結果は次のとおりです。
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
=========================================
======================================================
=========================================
=========================================
======================================================
=========================================
=========================================
=========================================
許可設定 - > myshirorealm.dogetauthorizationinfo()
=========================================
ページに複数のリソースが存在する場合、セッションを読み取り、更新するために、ドリードセッションと更新方法が絶えず呼び出されることがわかります。現在、この問題についてより良い解決策は見つかりませんでした。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。