基于redis的分布式session共享管理之銷毀事件不生效問題

一、前言

? ? ? ?首先介紹下分布式session共享管理

????????在Springboot項目中,經常提到分布式的概念,當實際部署應用后,多臺服務器各自存儲用戶登錄會話無法共享,導致操作A按鈕還是正常,操作B按鈕就提示登錄過期需要重新登錄。

? ? ? ? 這是因為接口分發將請求的sessionID傳入了不同服務器,未使用分布式session管理時只能在其中一臺服務器記錄登錄信息,所以另一臺機器收到請求sessionID識別為未登錄出現異常。

? ? ? ? 所以,此時需要將用戶會話信息存儲在中間件中,不依賴特定服務器,這樣就可以實現各服務器之間共享讀取中間件中用戶的會話,不會出現上述問題

二、問題

? ? ? ? 監聽session情況,創建、銷毀進行回調代碼如下

@Configuration
@Slf4j(topic = "login")
public class SpringSessionConfiguration implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {log.info("Session 創建: " + se.getSession().getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {log.info("Session 銷毀: " + se.getSession().getId());}}

通過debug打斷點發現,?不觸發根本原因?:

session失效進入了SessionRepositoryFilter類,沒有進入StandardSessionFacade導致的

我們來詳細分析這個問題的 原因解決方案


🧠 一、問題現象

  • 你實現了?HttpSessionListener,并注冊為 Spring Bean。
  • sessionCreated()?方法可以正常觸發。
  • 但?sessionDestroyed()?方法不執行,即使 Session 已經過期或被刪除。

🔍 二、根本原因分析

1. Spring Session 的 Session 生命周期管理機制

Spring Session(尤其是 spring-session-data-redis)是通過 SessionRepositoryFilter 來攔截請求并管理 Session 生命周期的。

  • 當用戶訪問時,SessionRepositoryFilter?會創建一個包裝過的?HttpSession(通常是?MapSession?或?RedisSession)。
  • 這個包裝過的?HttpSession?并不是原生的 Tomcat?StandardSessionFacade,而是 Spring 自己實現的抽象層。

2.?sessionDestroyed()?不觸發的原因

HttpSessionListener.sessionDestroyed()由 Servlet 容器(如 Tomcat)觸發的,只有當 Session 是由 Tomcat 管理的原生 Session 時才會觸發。

而使用 Spring Session 后:

  • Session 是由 Spring Session 管理的,不是由 Tomcat 創建的。
  • Session 的銷毀是通過 Spring Session 內部機制完成的(比如 Redis Key 過期、主動調用?session.invalidate())。
  • Tomcat 不知道 Session 被銷毀了,因此不會觸發?sessionDestroyed()?回調。

3. Session 過期后去哪了?

Spring Session 的 Session 過期通常有以下幾種方式:

  • Redis 中 Session Key 的 TTL 到期,被 Redis 自動刪除(被動過期)。
  • Spring Session 內部定時任務或請求時檢查過期(主動過期)。
  • 但這些方式都不會觸發?HttpSessionListener.sessionDestroyed(),因為不是 Tomcat 觸發的。

三、方案

? 方案一:監聽 Spring Session 的?SessionDestroyedEvent

Spring Session 提供了它自己的事件機制,你可以監聽 SessionDestroyedEvent 來替代 HttpSessionListener

@Component
@Slf4j
public class SessionEventListener {@EventListenerpublic void handleSessionCreated(SessionCreatedEvent event) {log.info("Session 創建: " + event.getSession().getId());}@EventListenerpublic void handleSessionDestroyed(SessionDestroyedEvent event) {log.info("Session 銷毀: " + event.getSessionId());}
}

? 方案二:啟用 Redis Key 過期事件 + 監聽 Redis 的?expired?事件

如果你的 Session 是被 Redis 主動刪除的(TTL 過期),Spring Session 默認不會感知到。

你需要:

配置文件中搜索開啟,重啟后生效?
notify-keyspace-events Ex

四、總結

? ? ? ? 經過筆者測試使用方案二實現最終效果,當會話過期自動調用銷毀方法,整個過程還是比較費勁,一邊結合AI分析,一邊查閱資料自己打斷點推敲,事實證明完全依賴AI無法解決實際問題,還需要人腦參與統籌分析,也勸各位讀者不要過分依賴AI。

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

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

相關文章

技術面試問題總結二

一、lvs的四種工作模式: LVS 有四種主要工作模式:NAT 模式、DR 模式、TUN 模式和Full-NAT 模式 1、NAT模式: 工作原理 LVS 作為客戶端和真實服務器(RS)之間的中間節點,接收客戶端請求后,修改請求的目標…

軟考(軟件設計師)軟件工程-軟件過程模型,敏捷開發

軟件過程模型 瀑布模型 #mermaid-svg-daxck2eQmqfYelkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-daxck2eQmqfYelkV .error-icon{fill:#552222;}#mermaid-svg-daxck2eQmqfYelkV .error-text{fill:#552222;stro…

MySQL 中圖標字符存儲問題探究:成因、解決方案及單字段編碼調整的利弊分析——仙盟創夢IDE

在 MySQL 數據庫應用中,常出現無法正確保存圖標字符,讀出時顯示為 “????” 的問題。本文深入剖析了該問題產生的原因,主要涉及字符編碼設置不匹配等因素。同時,提出了全面的解決方案,包括全局和單字段的字符編碼調…

快速上手UniApp(適用于有Vue3基礎的)

作為一位有Vue3基礎的開發者,學習UniApp將會是一個相對平滑的過程。UniApp是一個使用Vue.js開發跨平臺應用的前端框架,可以編譯到iOS、Android、H5以及各種小程序平臺。 一、UniApp簡介 UniApp是基于Vue.js的跨平臺開發框架,具有以下特點&a…

background和background-color的區別

前言:由于全局切換變量時,發現空頁面按鈕變量顏色未生效,審查元素發現變量未定義。實際上是背景色由純色變成了漸變色,而background-color不支持漸變色導致變量不生效特性backgroundbackground-color功能設置?所有?背景屬性&…

Vue Vue-route (5)

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue-route History模式和路由懶加載 目錄 History模式 設置history模式 后端配置 Apache 路由懶加載 配置 總結 History模式 設置history模式 Vue-route默認hash模式——使用URL的hash來模擬一個完整的URL&#xff0c…

家用智能攝像機PRV文件刪除的恢復方法

家用智能攝像頭一般采用的是mp4或者mov視頻方案,這一類方案文件通用性強、使用簡單,以MP4為例無論是APP在線播放還是TF卡接電腦查看都很輕松。即便如此,有些廠商還是走上了“自定義”的道路,自定義的文件結構導致無法正常播放&…

聊下easyexcel導出

直接上干貨&#xff0c;首先pom文件引入依賴 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>接下來是java代碼 public void export(List<Liquidity…

[Python] Flask 多線程繪圖時報錯“main thread is not in main loop”的解決方案

在構建基于 Flask 的后端服務過程中,使用 matplotlib 繪圖時,很多開發者會遇到一個經典的運行時錯誤: RuntimeError: main thread is not in main loop這通常出現在服務開啟多線程時調用 matplotlib,本文將從原理、解決方式到部署建議進行全面解析。 一、問題來源:matpl…

dbEaver連接hbase,各種問題的終極解決

網上有不少文章&#xff0c;但基本都不行&#xff0c;主要還是hbase版本和phoenix版本的問題&#xff0c;經我測試&#xff0c;如下方法保證能連接成功。 1、下載phoenix: https://phoenix.apache.org/download.html 要選擇和你的hbase版本對應的版本。 2、解壓phoenix-hbase-2…

selenium中find_element()用法進行元素定位

1. 導入必要的模塊首先需要導入 By 類&#xff1a;from selenium.webdriver.common.by import By2. 常用定位方式(1) 通過ID定位element driver.find_element(By.ID, "username") element.send_keys("testuser") # 輸入內容 (2) 通過Name定位element dr…

第八講~~數據庫技術

前言&#xff1a;什么是數據庫&#xff1f;存儲數據的倉庫。常見的數據庫有哪些&#xff1f;————SQL Server&#xff08;數據庫較大 5G&#xff09;————Access————Oracle&#xff08;大型數據庫700多兆-200多兆&#xff09;&#xff08;付費&#xff09;————My…

無人機雷達模塊運行與技術解析

一、運行方式1. 傳感器數據采集 雷達發射高頻電磁波&#xff08;X/Ku波段或毫米波&#xff09;&#xff0c;接收無人機反射的回波信號。 多傳感器協同&#xff1a;雷達與光電、無線電偵測、聲學設備并行掃描空域&#xff0c;覆蓋不同頻段與物理特性&#xff08;如熱信號、聲紋…

STM32中ADC詳解

前言 在嵌入式系統中&#xff0c;模擬信號與數字信號的轉換是連接物理世界與數字系統的核心環節。ADC&#xff08;Analog-to-Digital Converter&#xff0c;模數轉換器&#xff09;作為實現這一轉換的關鍵外設&#xff0c;被廣泛應用于傳感器數據采集&#xff08;如溫濕度、光照…

機器學習(ML)、深度學習(DL)、強化學習(RL)關系和區別

機器學習&#xff08;ML&#xff09;、深度學習&#xff08;DL&#xff09;、強化學習&#xff08;RL&#xff09;關系和區別區別一、機器學習的技術分層與范疇二、深度學習&#xff08;DL&#xff09; vs. 強化學習&#xff08;RL&#xff09;&#xff1a;在ML中的對比三、深度…

醫療AI前端開發中的常見問題分析和解決方法

一、 前端性能優化問題 (醫療AI場景尤其關鍵) 頁面加載速度慢的原因及解決方案 原因: 海量數據加載: 加載高分辨率DICOM影像序列、大型患者數據集、復雜模型參數。復雜計算: 在瀏覽器端運行輕量級AI推理(如分割預覽)、大型圖表渲染。第三方庫臃腫: 醫學可視化庫(Corners…

python庫之jieba 庫

jieba 庫jieba 庫的原理分析jieba庫可用于將中文的一段語句分解為單詞,通常用于解析中文語句的含義。例如外國人需要學習中文而中文語句是一直連續的文字組合。例如“我們在學習Python辦公自動化”這句話,外國人在理解這句話的含義時,首先需要將這句話正確地分解為一個個單詞,即…

基于Hadoop的航空公司客戶數據分析與客戶群體K-measn聚類分析(含LRFMC模型)

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹數據源介紹數據預處理hadoop集群分析建模分析總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 本研究依托全國范圍內的航空公司…

實習內容總結

相關來自AI非內部資料 Monorepo 大倉 + pnpm + Turborepo 工程化實踐原理 核心概念解釋 1. Monorepo (單倉庫架構) 概念:將多個項目(packages)放在同一個代碼倉庫中管理,而非分散在多個倉庫。優勢:統一管理依賴、版本一致性、跨項目復用代碼、原子化提交、簡化CI/CD流程…

余電快速泄放電路

余電快速泄放電路&#xff0c;即放電電路&#xff0c;用在需要快速反復開關電源&#xff0c;且負載電路上有大容量電容的場景。 斷開電源開關后&#xff0c;如果負載電路有大電容&#xff0c;會引起負載電路上的電壓下降緩慢。此時如果重新接上電源開關&#xff0c;負載電路在未…