เรารู้ว่า Shiro จัดการเซสชันผ่าน SessionManager และการดำเนินการของเซสชันจะถูกนำไปใช้ผ่าน SessionDao โดยค่าเริ่มต้น Shiro ใช้สองเซสชัน dao คือ cachingsessiondao และ memorysessiondao เมื่อเราใช้ Ehcache Cache เราจะใช้ CachingsessionDao หากแคชไม่สามารถใช้ได้เราจะเลือกเซสชันที่ใช้หน่วยความจำ ดังนั้นหากเราต้องการใช้การแบ่งปันเซสชันแบบกระจายตาม 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", "unchected"}) คลาสสาธารณะ delissessiondao ขยายบทคัดย่อ {// เวลาหมดเวลาเซสชันหน่วยเป็นมิลลิวินาที @Autowired Redistemplate Redistemplate; // Redis Operation Class หากคุณไม่คุ้นเคยกับสิ่งนี้คุณสามารถอ้างถึงบล็อกก่อนหน้านี้ Public RedissessionDao () {super (); } public redissessiondao (การหมดอายุที่ยาวนาน, redistemplate redistemplate) {super (); this.expiretime = หมดอายุ; this.edistemplate = redistemplate; } @Override // อัปเดตการอัปเดตโมฆะสาธารณะ (เซสชันเซสชัน) โยน UnknownSessionException { System.out.println ("================================================================================================= - - - session.getId () == null) {return;} session.settimeout (หมดอายุ); System.out.println ("============================================================================================================== - - - REDISTEMPLATE.OPSFORVALUE (). GetOperations (). Delete (Session.getId ()); GetactiveSessions () { System.out.println ("==================================================================================== - - - redistemplate.keys ("*"); System.out.println ("================================================================================================================================ - - - - - - timeunit.milliseconds); return sessionid; System.out.println ("=========================================================================================================================== - - - - - - } โมฆะสาธารณะ setexpiretime (การหมดอายุที่ยาวนาน) {this.expiretime = Expiretime; หลังจากใช้เซสชัน DAO เราต้องเพิ่มเซสชัน DAO ลงใน SessionManager รหัสมีดังนี้:
@Bean สาธารณะ defaultWebSessionAger configWebSessionManager () {defaultWebSessionManager manager = ใหม่ defaultWebSessionManager (); manager.setCacheManager (CacheManager); // เข้าร่วม Cache Manager Manager.SetsessionDao (SessionDao); // Set SessionDao Manager.SetDeleteInvalidSessions (จริง); // ลบ SESSION MANAGER.SetGlobalsessiontime manager.setsessionValidationsChedulerEnabled (จริง); // ตรวจสอบเซสชันตัวจัดการการส่งคืนตัวจัดการในเวลาไม่; - ขั้นตอนสุดท้ายคือการกำหนดค่า SessionManager เป็น SecurityManager
@Bean Public SecurityManager SecurityManager (DefaultWebSessionAnager WebSessionManager) {DefaultWebSecurityManager SecurityManager = ใหม่ defaultWebsecurityManager (); // ตั้งค่าอาณาจักร SecurityManager.setRealm (myshiReorealm ()); // Inject Cache Manager; SecurityManager.SetCacheManager (CacheManager); // ถ้าสิ่งนี้ถูกดำเนินการหลายครั้งมันเป็นวัตถุเดียวกัน // Session Manager SecurityManager.SetsessionManager (WebSessionManager); // ฉีดจำผู้จัดการของฉัน SecurityManager.SetRememberMemanager (RememberMemanager ()); 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 มากขึ้น