نحن نعلم أن Shiro يدير الجلسة من خلال SessionManager ، ويتم تنفيذ تشغيل الجلسة من خلال SessionDao. بشكل افتراضي ، يقوم Shiro بتنفيذ اثنين من SessionDao ، وهما Cachingsessiondao و MemorySessiondao. عندما نستخدم ذاكرة التخزين المؤقت Ehcache ، نستخدم CachingsessionDao. إذا كانت ذاكرة التخزين المؤقت غير قابلة للتطبيق ، فسنختار 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 ؛ ServiceSuppressWarnings ({"RawTypes" ، "Unchected"}) تمتد الفئة العامة RedissessionDao على ملخصات {// وقت زمنية الجلسة ، الوحدة هي milliseconds private long Expiretime = 120000 ؛ AUTOWIRED REDISTEMPLATE REDISTEMPLATE ؛ // REDIS CLASS ، إذا لم تكن على دراية بهذا ، فيمكنك الرجوع إلى المدونة السابقة RedissessionDao () {Super () ؛ } public redissessiondao (انتهاء الصلاحية الطويلة ، redistemplate redistemplate) {super () ؛ this.expiretime = Expiretime ؛ this.redistemplate = redistemplate ؛ } Override // Session Session Public Void Update (جلسة الجلسة) يلقي UnwareSessionException { System.out.println ("=================================================================================== ================================================================================================================================= ================================================================================================================================= ================================================================================================================================= Session.getId () == null) {return ؛ System.out.println ("================================================================================== =========================================================================================================================================== ==================================================================================================================================== =========================================================================================================================================== redistemplate.opsforvalue. GetActiptessions () { System.out.println ("========================================================================= ============================================================================================== ============================================================================================== ============================================================================================== redistemplate.keys ("*") ؛ System.out.println("==================================================================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== =========================================================== timeunit.milliseconds) ؛ system.out.println ("=================================================================================================================================================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== ========================================================== } public void setExpiretime (expirtime) {this.expiretime = expiretime ؛ بعد تنفيذ SessionDao ، نحتاج إلى إضافة SessionDao إلى SessionManager. الرمز كما يلي:
bean public defaultWebsessionManager configwebsessionManager () {defaultWebsessionManager Manager = new DefaultWebsessionManager () ؛ manager.setCachemanager (CacheManager) ؛ // انضم إلى مدير التخزين المؤقت. Manager.SetSessionValidationsChedulerEnabled (True) ؛ // Check Session Return Manager في أي وقت من الأوقات ؛ } الخطوة الأخيرة هي تكوين SessionManager إلى SecurityManager
Bean Public SecurityManager SecurityManager (DefaultWebSessionManager WebSessionManager) {defaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager () ؛ // تعيين عالم. SecurityManager.setRealM (myshirorealm ()) ؛ // حقن مدير ذاكرة التخزين المؤقت ؛ SecurityManager.setCachemanager (Cachemanager) ؛ // إذا تم تنفيذ ذلك عدة مرات ، فهو نفس الكائن ؛ // مدير الجلسة SecurityManager.SetSessionManager (WebSessionManager) ؛ //حقن تذكر مديري ؛ SecurityManager.setRemembleMemanager (remexmanmanager ()) ؛ Return SecurityManager ؛ } نتائج الاختبار كما يلي:
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
=========================================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
=========================================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
===================== DOREADSASTERASE =====================
تكوين الإذن -> myshirorealm.dogetauthorizationInfo ()
===================== DOREADSASTERASE =====================
سنجد أنه عندما توجد موارد متعددة في صفحة ما ، سيتم استدعاء أساليب Doreadsession والتحديث باستمرار لقراءة وتحديث الجلسات. في الوقت الحاضر ، لم يتم العثور على حل أفضل لهذه المشكلة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.