Kita tahu bahwa Shiro mengelola sesi melalui SesionManager, dan pengoperasian sesi diimplementasikan melalui sessiondao. Secara default, Shiro mengimplementasikan dua sessiondao, yaitu CachingSessiondao dan MemorySessiondao. Saat kami menggunakan cache EHCACHE, kami menggunakan CachingSessiondao. Jika cache tidak berlaku, kami akan memilih sessiondao berbasis memori. Oleh karena itu, jika kami ingin menerapkan berbagi sesi terdistribusi berdasarkan Redis, fokusnya adalah pada penulisan ulang sessiondao di sessionManager. Kode penulisan ulang kami adalah sebagai berikut:
paket com.chhliu.springboot.shiro.cache; impor java.io.serializable; impor java.util.collection; impor java.util.concurrent.timeunit; impor org.apache.shiro.Session.Session; impor org.apache.shiro.session.unknownsessionException; impor org.apache.shiro.session.mgt.eis.abstractsessiondao; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.data.redis.core.redistemplate; impor org.springframework.steretype.service; @Service @SuppressWarnings ({"RawTypes", "Uncecked"}) Redissessiondao kelas publik memperluas abstrakSessiondao {// waktu waktu tunggu sesi, unit adalah milidetik pribadi panjang ekspiretime = 120000; @Autowired private redistemplate redistemplate; // redis kelas operasi, jika Anda tidak terbiasa dengan ini, Anda dapat merujuk ke blog sebelumnya redissessiondao () {super (); } public redisSessiondao (Long Expiretime, redistemplate redistemplate) {super (); this.expiretime = kedaluwarsa; this.redistemplate = redistemplate; } @Override // Perbarui sesi public void update (sesi sesi) melempar UnknownSessionException { System.out.println ("========================================================================================================================================================================================= ======================================================================================================================================================= ======================================================================================================================================================= ======================================================================================================================================================= session.getID () == NULL) {return;} sesi. System.out.println ("==================================================================================================================================================================================== ========================================================================================================================================================= ====================================================================================================================================================================== ========================================================================================================================================================= redistemplate.opsforvalue (). getoperations (). hapus (sesion.getid ()); getactivesessions () { System.out.println ("========================================================================================================= ============================================================================================================================================================= ============================================================================================================================================================= ============================================================================================================================================================= redistemplate.keys ("*"); System.out.println ("=========================================================================================================================================== ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ Timeunit.milliseconds); System.out.println ("================================================================================================================================================= ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ================================================================ } public void setExpiretime (Long Expiretime) {this.expiretime = Expiretime; Setelah sessiondao diimplementasikan, kita perlu menambahkan sessiondao ke sessionManager. Kodenya adalah sebagai berikut:
@Bean DefaultWebSessionManager ConfigWebSessionManager () {DefaultWebSessionManager Manager = New DefaultWebSessionManager (); Manager.SetCachemanager (CacheManager); // Bergabunglah dengan Manajer Cache Manager.setsessiondao (sessiondao); // atur sessiondao manager.setDeleteInvalidSessions (true); // hapus sesi yang sudah kadaluwarsa. Manager.setsessionValidationsChedulerEnabled (true); // Periksa Sesi Return Manager tanpa waktu; } Langkah terakhir adalah mengonfigurasi sessionManager ke SecurityManager
@Bean Public SecurityManager SecurityManager (DefaultWebSessionager WebSessionManager) {DefaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager (); // Atur Realm. SecurityManager.setrealm (myshirorealm ()); // Suntikkan Cache Manager; SecurityManager.SetCacheManager (Cachemanager); // Jika ini dieksekusi beberapa kali, itu adalah objek yang sama; // Sesi Manajer SecurityManager.SetsessionManager (WebSessionManager); // suntikan ingat manajer saya; SecurityManager.setremembermemanager (RememberMeManager ()); Return SecurityManager; } Hasil tes adalah sebagai berikut:
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
==========================================
==================== DoreadSession =======================
==================== DoreadSession =======================
==========================================
==================== DoreadSession =======================
==================== DoreadSession =======================
==================== DoreadSession =======================
Konfigurasi Izin -> myshirorealm.dogetauthorizationInfo ()
==================== DoreadSession =======================
Kami akan menemukan bahwa ketika banyak sumber daya ada di halaman, metode doreadsession dan pembaruan akan dipanggil terus -menerus untuk membaca dan memperbarui sesi. Saat ini, tidak ada solusi yang lebih baik yang ditemukan untuk masalah ini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.