Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中,可以通過實現SessionDAO接口來將會話信息保存到Redis中,并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此,要更新Redis中的超時登錄時間,可以按照以下步驟進行操作:

  • 實現SessionDAO接口,將會話信息保存到Redis中。在實現SessionDAO接口時,可以使用Redis的EXPIRE命令來設置會話的過期時間。具體的實現方式取決于你使用的Redis客戶端庫。

  • 實現SessionValidationScheduler接口,定期檢查會話是否過期。在實現SessionValidationScheduler接口時,可以使用Redis的TTL命令來獲取會話的剩余過期時間,然后根據剩余過期時間來判斷會話是否過期。如果會話已經過期,則可以將其從Redis中刪除。

public class RedisSessionDAO implements SessionDAO {private RedisTemplate<String, Object> redisTemplate;@Overridepublic void update(Session session) throws UnknownSessionException {// 將會話信息保存到Redis中redisTemplate.opsForValue().set(session.getId(), session);// 設置會話的過期時間redisTemplate.expire(session.getId(), session.getTimeout(), TimeUnit.MILLISECONDS);}
}public class RedisSessionValidationScheduler implements SessionValidationScheduler {private RedisTemplate<String, Object> redisTemplate;@Overridepublic void enableSessionValidation() {// 定期檢查會話是否過期while (true) {Set<String> sessionIds = redisTemplate.keys("shiro:session:*");for (String sessionId : sessionIds) {Long ttl = redisTemplate.getExpire(sessionId, TimeUnit.SECONDS);if (ttl != null && ttl <= 0) {redisTemplate.delete(sessionId);}}try {Thread.sleep(60000); // 每分鐘檢查一次} catch (InterruptedException e) {e.printStackTrace();}}}
}

SecurityUtils.getSubject().getSession().setTimeout(TimeValue);里邊設置默認的Session過期時間,但是redis中 redisTemplate.opsForValue().set(SESSION_PREFIX+session.getId(),session,DEFAULT_TIME_OUT, TimeUnit.MINUTES);中的DEFAULT_TIME_OUT如何與TimeValue同步更新?

在Shiro框架中,SecurityUtils.getSubject().getSession().setTimeout(TimeValue)方法用于設置當前用戶的會話過期時間,而redisTemplate.opsForValue().set(SESSION_PREFIX+session.getId(),session,DEFAULT_TIME_OUT, TimeUnit.MINUTES)方法用于將會話信息保存到Redis中,并設置會話的過期時間。為了保持這兩個過期時間的同步更新,可以在SessionDAO的實現類中進行處理。

具體來說,可以在SessionDAO的實現類中定義一個常量,用于表示會話的默認過期時間。然后,在實現SessionDAO接口的create(Session session)方法和update(Session session)方法中,分別使用SecurityUtils.getSubject().getSession().getTimeout()方法獲取當前用戶的會話過期時間,和定義的常量進行比較,取較小值作為會話的過期時間。具體的實現方式如下:

public class RedisSessionDAO implements SessionDAO {private RedisTemplate<String, Object> redisTemplate;private static final long DEFAULT_EXPIRE_TIME = 30; // 默認過期時間,單位為分鐘@Overridepublic Serializable create(Session session) {// 獲取當前用戶的會話過期時間long expireTime = session.getTimeout() / 1000; // 轉換為秒if (expireTime > DEFAULT_EXPIRE_TIME * 60) {expireTime = DEFAULT_EXPIRE_TIME * 60;}// 將會話信息保存到Redis中,并設置過期時間redisTemplate.opsForValue().set(SESSION_PREFIX + session.getId(), session, expireTime, TimeUnit.SECONDS);return session.getId();}@Overridepublic void update(Session session) throws UnknownSessionException {// 獲取當前用戶的會話過期時間long expireTime = session.getTimeout() / 1000; // 轉換為秒if (expireTime > DEFAULT_EXPIRE_TIME * 60) {expireTime = DEFAULT_EXPIRE_TIME * 60;}// 將會話信息保存到Redis中,并設置過期時間redisTemplate.opsForValue().set(SESSION_PREFIX + session.getId(), session, expireTime, TimeUnit.SECONDS);}
}

在上述代碼中,DEFAULT_EXPIRE_TIME表示會話的默認過期時間,單位為分鐘。在create(Session session)方法和update(Session session)方法中,首先使用session.getTimeout()方法獲取當前用戶的會話過期時間,然后將其轉換為秒,并與DEFAULT_EXPIRE_TIME * 60進行比較,取較小值作為會話的過期時間。最后,將會話信息保存到Redis中,并設置過期時間為計算出的會話過期時間。這樣,就可以保持會話過期時間的同步更新了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214150.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一&#xff0c; 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) &#xff0c; 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式&#xff0c;分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存&#xff1a;線程之間共享程序的公共狀態&#xff0c;線程之間通過讀-寫內存中的公…

前端知識筆記(四十五)———前端開發與后端開發有什么區別

前端開發和后端開發是Web開發中的兩個關鍵領域&#xff0c;它們負責不同的任務和功能。下面是前端開發和后端開發之間的主要區別&#xff1a; 前端開發&#xff1a; 用戶界面&#xff1a;前端開發主要關注用戶界面的開發&#xff0c;包括網頁的布局、樣式、交互等方面。前端技…

Android集成科大訊飛語音識別與語音喚醒簡易封裝

目錄 一、語音喚醒部分 1、首先在科大訊飛官網注冊開發者賬號 2、配置喚醒詞然后下載sdk 3、選擇對應功能下載 4、語音喚醒lib包全部復制到工程目錄下 5、把語音喚醒詞文件復制到工程的assets目錄 6、復制對應權限到AndroidManifest.xml中 7、喚醒工具類封裝 二、語音識…

Linux學習第46天:Linux音頻驅動試驗:能不能?不行也得行。

Linux版本號4.1.15 芯片I.MX6ULL 大叔學Linux 品人間百味 思文短情長 CAN 是目前應用非常廣泛的現場總線之一&#xff0c;主要應用于汽車電子和工業領域&#xff0c;尤其是汽車 領域&#xff0c;汽車上大量的傳感器與模塊都是通過 C…

十二、MapReduce概述

1、MapReduce &#xff08;1&#xff09;采用框架 MapReduce是“分散——>匯總”模式的分布式計算框架&#xff0c;可供開發人員進行相應計算 &#xff08;2&#xff09;編程接口&#xff1a; ~Map ~Reduce 其中&#xff0c;Map功能接口提供了“分散”的功能&#xff…

【Java期末復習資料】(1)知識點總結

本文章主要是知識點&#xff0c;后續會出模擬卷 以下是選擇、填空可能考的知識點&#xff0c;多看幾遍&#xff0c;混個眼熟 面向對象程序設計的基本特征是&#xff1a;抽象、封裝、繼承、多態&#xff08;后三個是三大特性&#xff09;Java源文件的擴綴名是.java編譯Java App…

知識筆記(五十三)———MySQL 刪除數據表

MySQL中刪除數據表是非常容易操作的&#xff0c;但是你在進行刪除表操作時要非常小心&#xff0c;因為執行刪除命令后所有數據都會消失。 語法 以下為刪除 MySQL 數據表的通用語法&#xff1a; DROP TABLE table_name ; -- 直接刪除表&#xff0c;不檢查是否存在 或 DROP…

neuq-acm預備隊訓練week 8 P8794 [藍橋杯 2022 國 A] 環境治理

題目描述 輸入格式 輸出格式 輸出一行包含一個整數表示答案。 輸入輸出樣例 解題思路 最短路二分 AC代碼 #include<bits/stdc.h> using namespace std; long long temp,n, Q; long long f[105][105],min_f[105][105],cut[105],dis[105][105];//cut為減少多少&#x…

寶塔面板部署Apache服務器搭建本地站點發布到公網可訪問【內網穿透】

文章目錄 前言1. 環境安裝2. 安裝cpolar內網穿透3. 內網穿透4. 固定http地址5. 配置二級子域名6. 創建一個測試頁面 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家…

最短循環節問題 和 最短回文串(kmp , HASH )

給定一個字符串 s&#xff0c;你可以通過在字符串前面添加字符將其轉換為回文串。找到并返回可以用這種方式轉換的最短回文串。 示例 1&#xff1a; 輸入&#xff1a;s "aacecaaa" 輸出&#xff1a;"aaacecaaa"示例 2&#xff1a; 輸入&#xff1a;s &…

Java智慧校園-中小學校園管理系統源碼

智慧校園系統是通過信息化手段&#xff0c;實現對校園內各類資源的有效集成 整合和優化&#xff0c;實現資源的有效配置和充分利用&#xff0c;將校務管理過程的優化協調。為校園提供數字化教學、數字化學習、數字化科研和數字化管理。 致力于為家長和教師提供一個全方位、多層…

scripty妙用

在monorepo項目中&#xff0c;隨著子模塊增多&#xff0c; 每個子項目都需要配置各自的package.json,并且大同小異&#xff0c;為了進一步提高配置效率&#xff0c;引入了scripty&#xff0c;自己寫腳本&#xff0c;直接就可以用哦 1、安裝 npm install scripty --save-dev 2…

ARMday6作業

串口發送指令控制硬件工作 uart1.h #ifndef __UART1_H__ #define __UART1_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" void all_led_init(); void led1_on(); void led2_on(); void led3_o…

代碼隨想錄二刷 | 二叉樹 | 110.平衡二叉樹

代碼隨想錄二刷 &#xff5c; 二叉樹 &#xff5c; 110.平衡二叉樹 題目描述解題思路遞歸迭代 代碼實現遞歸法迭代法 題目描述 110.平衡二叉樹 給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a; 一個二叉…

EMNLP 2023 獲獎論文公布,大模型、NLP等領域火爆

EMNLP是計算語言學和自然語言處理領域頂級國際會議之一&#xff0c;屬于CCF B類&#xff0c;是由 ACL 下屬的SIGDAT小組主辦的NLP領域頂級國際會議&#xff0c;一年舉辦一次。相較于ACL&#xff0c;EMNLP更偏向于NLP在各個領域解決方案的學術探討。 今年的EMNLP 2023 已于2023…

table表格table/tr/td寬度和高度的設置

關于html中table表格tr,td的?度和寬度 做?頁的時候經常會遇到各種各樣的問題&#xff0c;經常遇到的?個就是會碰到表格被內容撐開的問題。 設置table樣式為 table-layout: fixed; 寬度可以了&#xff0c;但是高度會被撐高。怎么設置都不行&#xff0c;只能給這個td標簽單獨…

【Linux】 線程池

線程池 什么是線程池&#xff1f; 一次預先申請一批線程&#xff0c;讓這批線程有任務&#xff0c;就處理任務&#xff1b;沒任務&#xff0c;就處于等待狀態。 為什么要有線程池&#xff1f; 以空間換時間&#xff0c;預先申請一批線程&#xff0c;當有任務到來&#xff0c;可…