非控制器(如 Service、工具類)中便捷地獲取當前 HTTP 請求的上下文信息

非控制器(如 Service、工具類)中便捷地獲取當前 HTTP 請求的上下文信息

在 Spring 框架的 Web 開發中,RequestContextHolder 是一個非常實用的工具類,它的主要作用是在非控制器(如 Service、工具類)中便捷地獲取當前 HTTP 請求的上下文信息,避免了通過方法參數層層傳遞 HttpServletRequest 對象的繁瑣。

核心原理

Spring 在處理 HTTP 請求時,會將當前請求的 HttpServletRequest 對象存儲到 ThreadLocal 中(ThreadLocal 是線程局部變量,可確保多線程環境下數據隔離)。RequestContextHolder 則通過封裝對 ThreadLocal 的操作,提供了獲取這些上下文信息的靜態方法,讓開發者無需依賴參數傳遞就能訪問請求相關對象。

常用方法

  1. 獲取請求對象
  • HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

這是最常用的方式,通過 getRequestAttributes() 獲取封裝了請求信息的 ServletRequestAttributes 對象,再從中提取 HttpServletRequest。

  1. 獲取響應對象
  • HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();

同理,可獲取當前請求對應的響應對象。

  1. 判斷是否存在請求上下文
  • boolean hasContext = RequestContextHolder.getRequestAttributes() != null;

用于避免在非 Web 環境(如單元測試、定時任務)中調用時出現空指針異常。

使用場景

  • Service 層獲取請求信息:例如在 Service 中需要獲取客戶端 IP 地址、請求頭(如 Token)等,可通過 RequestContextHolder 直接獲取,無需在 Controller 層將這些信息作為參數傳入 Service。

  • 工具類中處理請求相關邏輯:比如日志工具類需要記錄請求 URL、方法等信息,通過該工具類可簡化代碼。

注意事項

  1. 僅在 Web 線程中有效:RequestContextHolder 依賴于 Spring 的請求處理線程,在異步線程(如 @Async 標注的方法)或非 Web 環境中調用,會返回 null,可能導致空指針異常,使用前需先判斷上下文是否存在。

  2. 避免過度依賴:雖然方便,但過度在 Service 層使用請求對象會增加代碼與 Web 環境的耦合性,不利于單元測試(非 Web 環境下需額外模擬上下文)。建議僅在必要時使用,優先通過參數傳遞關鍵信息。

  3. 線程安全問題:由于基于 ThreadLocal,在多線程場景下無需擔心線程安全問題,但需注意異步操作中無法共享父線程的請求上下文(需手動傳遞或配置線程池繼承上下文)。

總之,RequestContextHolder 是 Spring 簡化 Web 請求上下文訪問的重要工具,合理使用能提升開發效率,但需注意其適用場景和潛在風險,避免濫用導致代碼耦合性過高。

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

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

相關文章

Excel處理控件Aspose.Cells教程:使用 Python 在 Excel 中創建甘特圖

時間軸上的任務可視化有助于更好地管理項目。本文將學習如何使用Aspose.Cells for Python 通過 .NET在 Excel 中創建甘特圖。只需幾行代碼,即可將簡單的任務數據轉換為動態清晰的可視化時間軸,非常適合用于報表、儀表板和規劃文檔。 Aspose.Cells官方試…

【RK3568 平臺I2C協議與AGS10驅動開發】

RK3568 平臺I2C協議與AGS10驅動開發一、I2C 總線協議基礎二、I2C 通信過程詳解三、AGS10 傳感器概述四、AGS10驅動開發1. 硬件連接2. 設備樹(DTS)配置3. 內核驅動開發五、調試與驗證六、總結引言在嵌入式系統開發中,傳感器數據采集是常見需求…

arm版本的ubuntu安裝git或者vim等方法

看起來你在基于 ARM 的 Ubuntu 系統上安裝 Vim 時遇到了問題,錯誤提示為“E: 無法定位軟件包 vim”。這通常是因為系統的軟件包列表未更新,或者該軟件包在你檢查的標準軟件源中不可用。以下是通常可以解決這個問題的方法:1. 更新軟件包列表“…

MFC擴展庫BCGControlBar Pro v36.2新版亮點:可視化設計器升級

BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。 我們的組件可以輕松地集成到您的應用程序中,并為您節省數百個開發和調試時間。 BCGControlBar專業版 v36.2已全新發布了,在這個版本中添加了一個新的擴展器控件、改進了網格和報表…

小杰學C(eleven day)——莫道浮云終蔽日,總有云開霧散時。

1.結構體(1)內容定義:1.用戶自定義的數據類型2.可以包含若干不同數據類型(可相同)的成員變量3.這些數據項組合起來反應某一信息格式:struct 結構體名 (用戶自定義的數據類型){數據類型 成員變量1;數據類型 …

海豚遠程控制APP:隨時隨地,輕松掌控手機

在快節奏的現代生活中,我們常常需要在不同設備之間切換,管理手機也變得越來越重要。無論是遠程辦公、遠程學習還是日常生活中對手機的管理,一款高效、便捷的遠程控制軟件都能極大地提升我們的效率。海豚遠程控制APP正是這樣一款功能強大的手機…

Linux/Ubuntu安裝go

Linux/Ubuntu安裝go1. 首先移除舊版本(如有):2. 下載Go 1.23.9安裝包:3. 解壓到系統目錄:4. 設置環境變量(添加到~/.profile或~/.bashrc文件末尾):5.使環境變量生效:6. 驗…

教程:如何快速查詢 A 股實時 K線和5檔盤口

實時行情數據是量化交易策略、看板系統和交易決策系統的重要輸入。本文將以 Infoway API 提供的 WebSocket API 為例,教你如何使用 Python 快速接入并獲取 A 股的實時 K線數據 和 盤口數據。一、準備工作安裝 WebSocket 庫:pip install websockets二、查…

施易德門店管理系統應用案例分析:零售女裝品牌伊芙麗的全球化布局

在零售品牌的全球化進程中,如何應對不同市場的合規要求、實現本地化精細化運營,是企業面臨的重要課題。施易德(Cegid)門店管理系統憑借40年的全球零售數字化服務經驗,為多個品牌的海外拓展提供了支持。其中&#xff0c…

安全初級作業2

一、作業要求 1、xss-labs 1~8關 2、python實現自動化sql布爾育注代碼優化(二分查找) 二、操作過程 (一)xss-labs 1~8關 1、前期準備 (1)打開小皮面板,并啟動Apache和MySQL (2)將 xss-labs…

多模態大語言模型arxiv論文略讀(157)

Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and Meta-evaluation Benchmark ?? 論文標題:Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and M…

面試150——數組字符串

88. 合并兩個有序數組 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目。請你 合并 nums2 到 nums1 中,使合并后的數組同樣按 非遞減順序 排列。倒序比較,避免覆…

深入理解設計模式:命令模式詳解

在軟件開發中,我們經常遇到需要將"請求"或"操作"封裝成對象的情況。比如,GUI中的按鈕點擊、遙控器控制家電、事務系統中的操作回滾等場景。命令模式(Command Pattern)正是為解決這類問題而生的設計模式。本文…

自己寫的 MyHttpServlet 和直接繼承 HttpServlet 的區別

繼承你自己寫的 MyHttpServlet 和直接繼承 HttpServlet 的區別如下:1. 繼承 HttpServlet(官方推薦用法)HttpServlet 是 Java EE 官方提供的 Servlet 基類,已經實現了 Servlet 接口的大部分方法。它內部已經實現了 service() 方法&…

python庫 maya 庫的各種案例的使用詳解(人性化的日期時間處理)

文章目錄 一、Maya庫概述 1.1 maya介紹 1.2 安裝 maya 1.3 注意事項 二、基本使用 2.1 創建 MayaDT 對象 2.2 格式化輸出 2.3 時間運算 三、高級使用 3.1 時區處理 3.2 時間間隔 3.3 網絡時間獲取 四、實際應用示例 4.1 日志時間處理 4.2 會議時間提醒 4.3 國際化時間顯示 5. M…

企業選擇大帶寬服務器租用的原因有哪些?

大帶寬服務器作為各個行業使用較多的服務器類型,可以為企業提供更高的數據傳輸速率,極大縮短文件上傳與下載時間,對于大型文件,大帶寬服務器能夠將時間大幅縮減至數分鐘或數小時,提高企業整體的工作效率。大帶寬服務器…

使用canal同步分庫分表數據,到 Elasticsearch

作者:小凱 沉淀、分享、成長,讓自己和他人都能有所收獲! 本文的宗旨在于通過簡單干凈實踐的方式教會讀者,配置出一套 Canal 工具服務,來同步分庫分表的數據到 Elasticsearch 文件夾系統中。同時在 SpringBoot 工程中&a…

氣候為何愈演愈“炙” — 未來五年高溫趨勢與 AI 氣象大模型的突破性價值

早、更準 代表性模型 主要特征 應用進展 GraphCast(DeepMind) 10 天全球預報;0.25 分辨率;< 1 min 推理 90 % 指標超 ECMWF HRES,已用于極端風暴提前鎖定Google DeepMind MetNet-3(Google Research) 1–4 km 分辨率;2 min 時序;24 h 區域精細預報 美東、歐洲已在 G…

LVS四種模式及部署NAT、DR模式集群

1、lvs簡介LVS:Linux Virtual Server&#xff0c;負載調度器&#xff0c;內核集成&#xff0c;章文嵩&#xff0c;阿里四層SLB(ServerLoadBalance)是基于LVSkeepalived實現LVS 官網: http://www.linuxvirtualserver.org/LVS 相關術語VS: Virtual Server&#xff0c;負責調度RS:…

【Linux】Ubuntu22.04安裝zabbix

官方文檔&#xff1a;zabbix安裝文檔 環境如下 環境版本nginx1.26.3zabbix7.0.16mysql8.0.41 安裝nginx和mysql 一鍵部署腳本 部署zabbix #!/bin/bash wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0ubuntu22.04_…