Spring 攔截器(Interceptor)與過濾器(Filter)對比

Spring 攔截器(Interceptor)與過濾器(Filter)對比


核心對比表格
對比維度攔截器(Interceptor)過濾器(Filter)
定義Spring MVC 提供的組件,集成于 Spring 處理器鏈。Servlet 規范組件,屬于 Java EE 標準。
作用范圍僅限于映射到 Controller 的請求(如 @RequestMapping 處理的請求)。所有請求(包括靜態資源、非 Spring 處理的請求)。
執行時機Spring MVC 處理器鏈中執行(Controller 方法前后)。Servlet 容器啟動時初始化,請求到達時立即執行(在 Spring MVC 處理器鏈之前)。
生命周期由 Spring 容器管理(默認單例),無顯式 init()destroy() 方法。由 Servlet 容器管理,需實現 init()destroy() 方法。
核心方法preHandle(), postHandle(), afterCompletion()init(), doFilter(), destroy()
配置方式通過 WebMvcConfigurer.addInterceptors() 注冊。通過 FilterRegistrationBeanweb.xml 注冊。
典型使用場景權限驗證、日志記錄、請求參數校驗、與 Spring 服務層交互。跨域處理(CORS)、日志記錄、請求壓縮、靜態資源攔截、通用 HTTP 頭處理。
依賴注入支持支持 @Autowired 等 Spring 依賴注入。需通過 FilterRegistrationBean@Component 顯式注入。
執行順序控制通過 order() 方法設置優先級(數值越小優先級越高)。通過 FilterRegistrationBean.setOrder()web.xml 的聲明順序控制。
異常處理通過 afterCompletion() 處理異常(需配合 HandlerExceptionResolver)。需在 doFilter() 中通過 try-catch 捕獲異常。
性能影響僅針對 Controller 請求,性能影響較小。針對所有請求,可能影響性能(如頻繁的靜態資源請求)。

關鍵區別示例
場景 1:身份驗證
  • 攔截器:適合與 Spring 服務層結合,如通過 @Autowired 注入 UserService 驗證 Token。
  • 過濾器:適合通用 Token 驗證(如 JWT),攔截所有請求(包括登錄接口)。
場景 2:日志記錄
  • 攔截器:記錄 Controller 方法級別的執行時間。
  • 過濾器:記錄所有請求的 URL、響應時間(包括靜態資源)。
場景 3:異常處理
  • 攔截器:通過 afterCompletion() 統計接口錯誤率。
  • 過濾器:需在 doFilter() 中通過 try-catch 處理異常。

代碼示例對比
攔截器配置
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).order(1).addPathPatterns("/**").excludePathPatterns("/login");}
}
過濾器配置
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<CorsFilter> corsFilterRegistration() {FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new CorsFilter());registration.addUrlPatterns("/*");registration.setOrder(2);return registration;}
}

生命周期對比
階段攔截器(Interceptor)過濾器(Filter)
初始化由 Spring 容器自動初始化,無 init() 方法。需實現 init() 方法,在 Servlet 容器啟動時調用。
請求處理preHandle() → Controller → postHandle()afterCompletion()doFilter() 中處理請求(需顯式調用 chain.doFilter())。
銷毀由 Spring 容器管理,無 destroy() 方法。需實現 destroy() 方法,在應用關閉時調用。

執行流程圖
客戶端請求 →
├─ Filter 的 doFilter() →
│  ├─ Filter 前置處理 →
│  │  └─ 繼續 FilterChain →
│  │     ├─ Interceptor 的 preHandle() →
│  │     │  └─ 攔截器前置處理 →
│  │     │     └─ Controller 方法執行 →
│  │     │        └─ Interceptor 的 postHandle() →
│  │     │           └─ 攔截器后置處理 →
│  │     └─ Interceptor 的 afterCompletion() →
│  │        └─ 攔截器完成處理
│  └─ Filter 后置處理
└─ 響應返回

選擇建議
  1. 使用攔截器的場景

    • 需要與 Spring 上下文深度集成(如依賴注入服務層)。
    • 僅需處理 Controller 映射的請求(如 /api/**)。
    • 需要細粒度控制請求生命周期(如方法執行前后校驗)。
  2. 使用過濾器的場景

    • 需要攔截所有請求(包括靜態資源、非 Spring 處理的請求)。
    • 需要直接操作請求/響應對象(如修改 HTTP 頭、壓縮響應)。
    • 需要在請求到達 Spring 處理器鏈之前執行邏輯(如統一日志記錄)。

總結
  • 攔截器Spring MVC 的高級組件,適合與 Spring 生態深度集成,處理 Controller 層的業務邏輯。
  • 過濾器Servlet 規范的底層組件,適合通用請求處理(如跨域、日志),作用范圍更廣但靈活性較低。

兩者可以 同時使用,形成更復雜的處理鏈(例如:過濾器處理跨域,攔截器處理權限驗證)。

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

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

相關文章

VulnHub-FALL通關攻略

第一步&#xff1a;確定靶機IP為192.168.40.129 第二步&#xff1a;掃描后臺及開放端口 #開放端口 22 --- ssh 25 --- SMTP簡單郵件傳輸協議 80 --- HTTP萬維網傳輸信息協議 110 --- POP3郵件協議3 139 --- NetBIOS服務 443 --- https服務 445 --- SMB協議 3306 --- Mysql 808…

Qt 線程和 QObjects

線程和 QObjects QThread 繼承于 QObject。 它發出信號來指示線程開始或結束執行&#xff0c;并提供一些插槽。 更有趣的是&#xff0c;QObjects 可以在多個線程中使用&#xff0c;發出信號以調用其他線程中的插槽&#xff0c;并向 "生活 "在其他線程中的對象發布事件…

華為、浪潮、華三鏈路聚合概述

1、華為 鏈路聚合可以提高鏈路帶寬和鏈路冗余性。有三種類型&#xff0c;分別是手工鏈路聚合&#xff0c;靜態lacp鏈路聚合&#xff0c;動態lacp鏈路聚合。 手工鏈路模式&#xff1a;也稱負載分擔模式&#xff0c;需手動指定鏈路&#xff0c;各鏈路之間平均分擔流量。靜態LAC…

HarmonyOS NEXT 鴻蒙中關系型數據庫@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 數據庫 數據庫是存儲和管理數據的系統 數據庫&#xff08;Database&#xff09;是一個以特定方式組織、存儲和管理數據的集合&#xff0c;通常用于支持各種應用程序和系統的運行。它不僅是存放數據的倉庫&#xff0c;還通過一定的…

步進電機 cia402協議 報文自己的理解 (筆記)

1. cai402 協議是什么 CiA 402 協議&#xff08;CAN in Automation 402&#xff09;&#xff0c;它是工業自動化領域中的一種通信協議&#xff0c;主要用于運動控制&#xff08;如伺服驅動器、步進電機等&#xff09;&#xff08; &#xff09;所屬標準 CiA 402 是 CANopen 應用…

鴻蒙攝像機,一場智能安防的“平權革命”

2025的春天&#xff0c;全國各行各業都感受到了普惠AI的魅力。大模型帶來的技術平權&#xff0c;讓每一個人都能輕松用上AI。 這時候&#xff0c;企業想知道&#xff0c;每時每刻離不開的攝像機&#xff0c;究竟什么時候才能迎來智能技術的平權與普惠。 博思數據研究中心的一份…

解決HuggingFaceEmbeddings模型加載報錯:缺少sentence-transformers依賴包

遇到報錯 報錯信息: Error loading model: Could not import sentence_transformers python package. Please install it with pip install sentence-transformers. 裝包信息&#xff1a; pip install modelscope langchain sentence_transformers langchain-huggingface on…

從泛讀到精讀:合合信息文檔解析如何讓大模型更懂復雜文檔

從泛讀到精讀&#xff1a;合合信息文檔解析如何讓大模型更懂復雜文檔 一、引言&#xff1a;破解文檔“理解力”瓶頸二、核心功能&#xff1a;合合信息的“破局”亮點功能亮點1&#xff1a;復雜圖表的高精度解析圖表解析&#xff1a;為大模型裝上精準“標尺”表格數據精準還原 功…

Python+requests實現接口自動化測試框架

為什么要做接口自動化框架 1、業務與配置的分離 2、數據與程序的分離&#xff1b;數據的變更不影響程序 3、有日志功能&#xff0c;實現無人值守 4、自動發送測試報告 5、不懂編程的測試人員也可以進行測試 正常接口測試的流程是什么&#xff1f; 確定接口測試使用的工具…

信息學奧賽一本通 1514:【例 2】最大半連通子圖 | 洛谷 P2272 [ZJOI2007] 最大半連通子圖

【題目鏈接】 ybt 1514&#xff1a;【例 2】最大半連通子圖 洛谷 P2272 [ZJOI2007] 最大半連通子圖 【題目考點】 1. 圖論&#xff1a;強連通分量 縮點 2. 圖論&#xff1a;拓撲排序 有向無環圖動規 【解題思路】 對于圖中任意兩頂點u、v&#xff0c;滿足u到v或v到u有路徑…

Android打aar包問題總結

1、moduleA 依賴 moduleB&#xff0c;將moduleA打包成aar時&#xff0c;未包含 moduleB的resources資源&#xff1b; 方法一&#xff1a;將moduleB的資源&#xff0c;手動拷貝一份到moduleA中&#xff1b; 方法二&#xff1a;使用 fat-aar 插件&#xff1b; 2、fat-aar插件使…

【網絡協議】【http】http 簡單介紹

【網絡協議】【http】http 簡單介紹 1 HTTP 頭部 HTTP 是一種請求-響應協議&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回響應。 1.1 HTTP 狀態碼 狀態碼是服務器返回給客戶端的 三位數字代碼&#xff0c;用于表示請求的執行結果。 狀態碼按照首位數字分類&am…

談談空間復雜度考量,特別是遞歸調用棧空間消耗?

空間復雜度考量是算法設計的核心要素之一&#xff0c;遞歸調用棧的消耗問題在前端領域尤為突出。 以下結合真實開發場景進行深度解析&#xff1a; 一、遞歸調用棧的典型問題 1. 深層次DOM遍歷的陷阱 // 危險操作&#xff1a;遞歸遍歷未知層級的DOM樹 function countDOMNode…

LeetCode算法題(Go語言實現)_16

題目 給定一個二進制數組 nums 和一個整數 k&#xff0c;假設最多可以翻轉 k 個 0 &#xff0c;則返回執行操作后 數組中連續 1 的最大個數 。 一、代碼實現 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …

【數據結構】棧 與【LeetCode】20.有效的括號詳解

目錄 一、棧1、棧的概念及結構2、棧的實現3、初始化棧和銷毀棧4、打印棧的數據5、入棧操作---棧頂6、出棧---棧頂6.1棧是否為空6.2出棧---棧頂 7、取棧頂元素8、獲取棧中有效的元素個數 二、棧的相關練習1、練習2、AC代碼 個人主頁&#xff0c;點這里~ 數據結構專欄&#xff0c…

攻破tensorflow,勇創最佳agent(2)---損失(loss) 準確率(accuracy)問題

實戰播: 怎么判定一個模型好不好,你設置的值對不對? 需要再看幾個值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…

pdfh5 pdf

踩坑1&#xff1a; 渲染失敗 &#xff08;1&#xff09;在vue項目中&#xff0c;讀取本地的pdf文件需要放到public下static文件夾中&#xff0c;不能放在別的地方&#xff1b; &#xff08;2&#xff09;引用時&#xff0c;不能使用相對路徑&#xff0c;因為使用public文件下…

6.5 模擬專題:LeetCode 38. 外觀數列

1. 題目鏈接 LeetCode 38. 外觀數列 2. 題目描述 給定一個正整數 n&#xff0c;生成外觀數列的第 n 項。外觀數列的定義如下&#xff1a; 第 1 項為 "1"。第 n 項是對第 n-1 項的描述。例如&#xff0c;第 2 項描述第 1 項&#xff08;"1"&#xff09;為…

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能與機器人學交叉的前沿領域&#xff0c;強調智能體通過身體與環境的動態交互實現自主學習和進化&#xff0c;其核心在于將感知、行動與認知深度融合?。通俗地講&#xff0c;就是機器人或者智能系統在物理環境中…

git命令使用小記(打補丁)

需求&#xff1a;需要從開發分支提取本人提交代碼&#xff0c;然后合并到主分支 一、制作補丁包 mkdir -p patches for commit in $(git log commitA..commitB --author"username" --reverse --prettyformat:"%h"); do …