Spring?Boot攔截器Interceptor與過濾器Filter實(shí)戰(zhàn)指南
一、核心概念與原理對(duì)比
1. 技術(shù)規(guī)范層級(jí)
- Filter(過濾器) 基于Servlet規(guī)范(J2EE標(biāo)準(zhǔn)),由Servlet容器(如Tomcat)管理,不依賴Spring框架。 示例:字符編碼過濾器
CharacterEncodingFilter。 - Interceptor(攔截器) 基于Spring MVC框架機(jī)制,由Spring容器管理,與Spring上下文深度集成。 示例:登錄認(rèn)證攔截器
AuthInterceptor。
2. 生命周期與作用范圍
| 特性 | Filter | Interceptor |
|---|---|---|
| 初始化時(shí)機(jī) | Web應(yīng)用啟動(dòng)時(shí)初始化 | 首次請(qǐng)求觸發(fā)時(shí)初始化 |
| 作用范圍 | 所有Web資源(Servlet、靜態(tài)資源) | 僅Spring MVC的Controller請(qǐng)求 |
| 執(zhí)行階段 | Servlet處理前后 | Controller方法執(zhí)行前、后及視圖渲染后 |
3. 執(zhí)行流程順序
HTTP請(qǐng)求 → Filter鏈 → DispatcherServlet → Interceptor.preHandle → Controller處理 → Interceptor.postHandle → 視圖渲染 → Interceptor.afterCompletion → Filter鏈返回響應(yīng)
二、使用場(chǎng)景與選型策略
1. 優(yōu)先選擇Filter的場(chǎng)景
- 全局基礎(chǔ)處理 需對(duì)所有請(qǐng)求統(tǒng)一處理,如:
- 字符編碼設(shè)置(UTF-8)
- 跨域處理(CORS頭配置)
- XSS防御(參數(shù)過濾)
- 非Spring環(huán)境 項(xiàng)目未使用Spring框架時(shí),F(xiàn)ilter是唯一選擇。
- 代碼示例(Filter)
@WebFilter("/*")
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
long start = System.currentTimeMillis();
chain.doFilter(req, res); // 必須放行請(qǐng)求
System.out.println("耗時(shí):" + (System.currentTimeMillis() - start));
}
}2. 優(yōu)先選擇Interceptor的場(chǎng)景
- 業(yè)務(wù)邏輯攔截 需與Spring上下文交互時(shí),如:
- 登錄認(rèn)證(讀取Session)
- 權(quán)限校驗(yàn)(結(jié)合Spring Security)
- 參數(shù)預(yù)處理(如分頁參數(shù)封裝)
- 代碼示例(Interceptor)
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
if (req.getSession().getAttribute("user") == null) {
res.sendRedirect("/login");
return false; // 中斷請(qǐng)求
}
return true;
}
}3. 混合使用場(chǎng)景
- 日志記錄:Filter記錄請(qǐng)求開始時(shí)間,Interceptor記錄Controller耗時(shí)
- 安全防護(hù):Filter做XSS過濾,Interceptor做權(quán)限校驗(yàn)
三、實(shí)現(xiàn)步驟與配置指南
1. Filter開發(fā)步驟
- 實(shí)現(xiàn)Filter接口 重寫
doFilter方法,注意調(diào)用chain.doFilter()放行請(qǐng)求 。 - 注冊(cè)方式
- 注解方式:
@WebFilter(urlPatterns="/*")(需主類加@ServletComponentScan) - 配置類方式(推薦):
- 注解方式:
@Bean
public FilterRegistrationBean<LogFilter> logFilter() {
FilterRegistrationBean<LogFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new LogFilter());
bean.setOrder(1); // 優(yōu)先級(jí)
bean.addUrlPatterns("/*");
return bean;
}2. Interceptor開發(fā)步驟
- 實(shí)現(xiàn)HandlerInterceptor接口 重寫
preHandle、postHandle、afterCompletion三階段方法 。 - 注冊(cè)攔截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login", "/static/**");
}
}四、常見問題與避坑指南
1. 執(zhí)行順序問題
- 多個(gè)Filter:按
@Order值或注冊(cè)順序執(zhí)行 - 多個(gè)Interceptor:按
registry.addInterceptor()添加順序執(zhí)行 - 經(jīng)典錯(cuò)誤:在Filter中修改請(qǐng)求參數(shù)后,Interceptor未獲取到新值(需使用
HttpServletRequestWrapper包裝類)
2. 配置路徑陷阱
- Filter路徑匹配:
/*表示所有路徑,/api/*僅匹配一級(jí)子路徑 - Interceptor排除路徑:靜態(tài)資源需顯式排除(如
excludePathPatterns("/static/**"))
3. Spring上下文依賴
- Filter中注入Bean:需通過
FilterRegistrationBean配置,直接@Autowired會(huì)失效(解決方法:使用WebApplicationContextUtils獲取上下文) - Interceptor中注入Bean:可直接使用
@Autowired(Spring管理)
4. 請(qǐng)求阻塞問題
- Filter未調(diào)用chain.doFilter():導(dǎo)致請(qǐng)求未傳遞到后續(xù)組件
- Interceptor的preHandle返回false:需手動(dòng)響應(yīng)錯(cuò)誤信息(如
response.sendError(401))
五、總結(jié)與選型建議
| 維度 | Filter優(yōu)勢(shì) | Interceptor優(yōu)勢(shì) |
|---|---|---|
| 技術(shù)棧 | 兼容所有Java Web項(xiàng)目 | 深度整合Spring生態(tài) |
| 性能 | 更接近底層,處理速度快 | 可訪問Spring上下文,業(yè)務(wù)邏輯處理更便捷 |
| 靈活性 | 全局處理能力強(qiáng) | 支持細(xì)粒度控制(如按Controller方法攔截) |
選型口訣:
- “底層通用選Filter,業(yè)務(wù)整合用Interceptor”
- “靜態(tài)資源走Filter,動(dòng)態(tài)請(qǐng)求過Interceptor”
通過合理搭配Filter與Interceptor,可構(gòu)建高效、安全的Web應(yīng)用。建議在復(fù)雜項(xiàng)目中結(jié)合使用,發(fā)揮各自優(yōu)勢(shì),如Filter處理全局基礎(chǔ)設(shè)施,Interceptor處理業(yè)務(wù)邏輯
到此這篇關(guān)于Spring Boot攔截器Interceptor與過濾器Filter實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Spring Boot攔截器Interceptor與過濾器Filter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中do-while循環(huán)的使用方法及注意事項(xiàng)詳解
這篇文章主要介紹了Java中do-while循環(huán)的使用方法及注意事項(xiàng)的相關(guān)資料,在Java編程中,do-while循環(huán)是一種基本的循環(huán)控制結(jié)構(gòu),它至少執(zhí)行一次循環(huán)體,然后根據(jù)條件判斷是否繼續(xù),文中將用法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
Java前端開發(fā)之HttpServletRequest的使用
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強(qiáng)大2023-01-01
java后臺(tái)啟動(dòng)jar包的一些命令匯總
這篇文章主要介紹了java后臺(tái)啟動(dòng)jar包的一些命令匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-03-03
Spring Boot啟動(dòng)及退出加載項(xiàng)的方法
這篇文章主要介紹了Spring Boot啟動(dòng)及退出加載項(xiàng)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
SpringCloud?分布式鎖的多種實(shí)現(xiàn)
本文主要介紹了SpringCloud?分布式鎖的多種實(shí)現(xiàn),主要有三種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源
在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

