Java中過濾器和攔截器的區(qū)別有哪些
前言
在 Spring Boot 中,過濾器(Filter)和攔截器(Interceptor)都用于處理請求和響應,但它們在實現(xiàn)機制、作用范圍和使用場景上有明顯區(qū)別,主要體現(xiàn)在以下幾個方面:
1.技術(shù)本質(zhì)不同
過濾器(Filter)
是 Java Servlet 規(guī)范定義的組件,屬于 Servlet 容器層面的技術(shù),不依賴 Spring 框架。
基于函數(shù)回調(diào)實現(xiàn),工作在 Web 容器的請求處理鏈最外層,可以攔截所有進入容器的請求(包括靜態(tài)資源、JSP 等)。攔截器(Interceptor)
是 Spring 框架自身定義的組件,依賴 Spring 容器,屬于 Spring MVC 層面的技術(shù)。
基于 Java 反射(AOP 思想)實現(xiàn),僅能攔截 Spring MVC 處理的請求(即通過DispatcherServlet分發(fā)的請求)。
2.執(zhí)行時機不同
請求處理流程中,兩者的執(zhí)行順序如下:請求進入容器 → Filter 攔截 → DispatcherServlet 分發(fā) → Interceptor 攔截 → Controller 處理 → Interceptor 后置處理 → Filter 后置處理 → 響應返回

- Filter:在請求到達
DispatcherServlet之前執(zhí)行,且在響應返回客戶端前最后執(zhí)行。 - Interceptor:在
DispatcherServlet之后、Controller 之前執(zhí)行,且在 Controller 處理完成后、視圖渲染前后還有對應的回調(diào)方法。
3.攔截范圍不同
- Filter:可攔截所有請求(如
.html、.css、.js等靜態(tài)資源,以及非 Spring MVC 處理的請求)。 - Interceptor:僅攔截 Spring MVC 管理的請求(即通過
@Controller或@RestController定義的接口),對靜態(tài)資源、直接訪問的 JSP 等不生效。
4.注入能力不同
- Filter:由 Servlet 容器管理生命周期,默認情況下無法直接注入 Spring 容器中的 Bean(需通過特殊配置才能獲取 Spring 上下文)。
- Interceptor:由 Spring 容器管理,可直接注入 Spring 中的 Bean(如 Service、Repository 等),便于使用 Spring 的功能。
5.方法回調(diào)不同
- Filter:核心方法是
doFilter(ServletRequest, ServletResponse, FilterChain),通過FilterChain.doFilter()放行請求,僅有請求前和響應后兩個處理時機。 - Interceptor:提供三個核心方法:
preHandle():Controller 執(zhí)行前調(diào)用(返回true放行,false攔截)。postHandle():Controller 執(zhí)行后、視圖渲染前調(diào)用。afterCompletion():視圖渲染完成后、響應返回前調(diào)用(無論是否異常都會執(zhí)行)。
6.使用場景不同
Filter:適合處理與 Servlet 容器相關(guān)的通用邏輯,如:
- 編碼轉(zhuǎn)換(如統(tǒng)一設置
UTF-8)。 - 跨域請求處理(CORS 配置)。
- 敏感字符過濾、請求日志記錄(包括靜態(tài)資源)。
- 身份驗證(如基于 Session 的登錄校驗)。
- 編碼轉(zhuǎn)換(如統(tǒng)一設置
Interceptor:適合處理與 Spring MVC 相關(guān)的業(yè)務邏輯,如:
- 權(quán)限精細校驗(結(jié)合 Spring Security 或自定義權(quán)限邏輯)。
- 業(yè)務日志記錄(僅針對接口請求)。
- 接口性能監(jiān)控(記錄請求處理時間)。
- 事務管理相關(guān)的預處理/后處理。
書中的關(guān)于過濾器和攔截器的區(qū)別?
(1)使用范圍不同:Filter是Servlet規(guī)范規(guī)定的,只能用于web程序中。而攔截器既可以用于web程序,也可以用于Application、swing程序中。
(2)規(guī)范不同:Filter是在servlet規(guī)范中定義的,是Servlet容器支持的,而攔截器是在spring容器內(nèi)的,是spring框架支持的。
(3)使用的資源不同:同其他的代碼塊一樣,攔截器也是一個spring的組件,歸spring管理,配置在spring文件中,因此能使用spring里的任何資源,獨享。例如service對象、數(shù)據(jù)源、事務管理等,通過IOC注入到攔截器即可;而Filter不能。
(4)深度不同:Filter只在Servlet前后起作用。而攔截器能深入到方法前后、異常拋出前后等。因此攔截器的使用靈活性更大。所以在Spring為基礎(chǔ)的構(gòu)架的程序中,優(yōu)先使用攔截器。
總結(jié)
- 過濾器是 Servlet 級別的“全局攔截”,適合處理容器層面的通用邏輯,不依賴 Spring。
- 攔截器是 Spring MVC 級別的“業(yè)務攔截”,適合處理與 Spring 集成的業(yè)務邏輯,功能更靈活。
實際開發(fā)中,兩者可配合使用(如 Filter 處理編碼和跨域,Interceptor 處理接口權(quán)限)。
到此這篇關(guān)于Java中過濾器和攔截器的區(qū)別有哪些的文章就介紹到這了,更多相關(guān)Java過濾器和攔截器區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot配置內(nèi)容加密實現(xiàn)敏感信息保護
之前我們講過的配置相關(guān)知識都是Spring?Boot原生就提供的,而今天我們將介紹的功能并非Spring?Boot原生就支持,但卻非常有用:配置內(nèi)容的加密2021-11-11
Java Fluent Mybatis 分頁查詢與sql日志輸出詳解流程篇
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強框架 fluent mybatis關(guān)于分頁查詢、sql日志輸出流程2021-10-10
SpringMVC使用MultipartFile 實現(xiàn)異步上傳方法介紹
這篇文章主要介紹了SpringMVC使用MultipartFile 實現(xiàn)異步上傳方法介紹,涉及pom依賴的添加,配置文件的修改等具體操作代碼,需要的朋友可以了解下。2017-09-09
SpringBoot集成H2內(nèi)存數(shù)據(jù)庫的方法
H2是Thomas Mueller提供的一個開源的、純java實現(xiàn)的關(guān)系數(shù)據(jù)庫。本文主要介紹了SpringBoot集成H2內(nèi)存數(shù)據(jù)庫,具有一定的參考價值,感興趣的可以了解一下2021-09-09

