Spring中過濾器和攔截器的區(qū)別及具體實現(xiàn)方式
在 Spring 框架中,過濾器(Filter) 和 攔截器(Interceptor) 都是用于處理 HTTP 請求的中間件,但它們在作用范圍、實現(xiàn)方式和生命周期上有顯著區(qū)別。以下是詳細(xì)對比和實現(xiàn)方式:
核心區(qū)別
| 特性 | 過濾器 (Filter) | 攔截器 (Interceptor) |
|---|---|---|
| 規(guī)范 | Servlet 規(guī)范 (J2EE 標(biāo)準(zhǔn)) | Spring 框架特有 |
| 作用范圍 | 所有 Web 資源(Servlet、JSP、靜態(tài)資源) | 僅 Spring MVC 管理的 Controller 請求 |
| 依賴 | 依賴 Servlet 容器(如 Tomcat) | 依賴 Spring 容器 |
| 攔截時機 | 在請求進入 Servlet 前 / 響應(yīng)發(fā)送到客戶端前 | 在請求進入 Controller 前 / 后 / 視圖渲染后 |
| 獲取 Spring Bean | 不能直接獲?。ㄐ柰ㄟ^工具類) | 可直接獲取 Spring Bean |
| 異常處理 | 無法使用 Spring 的異常處理機制 | 可結(jié)合 @ControllerAdvice 統(tǒng)一異常處理 |
實現(xiàn)方式
1. 過濾器 (Filter) 實現(xiàn)
過濾器是 Servlet 規(guī)范的一部分,通過實現(xiàn) javax.servlet.Filter 接口實現(xiàn)。
步驟:
- 創(chuàng)建 Filter 類
import javax.servlet.*;
import java.io.IOException;
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
// 初始化邏輯
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1. 請求到達(dá) Controller 前的邏輯
System.out.println("Before Controller (Filter)");
// 放行請求
chain.doFilter(request, response);
// 2. 響應(yīng)返回客戶端前的邏輯
System.out.println("After Controller (Filter)");
}
@Override
public void destroy() {
// 銷毀邏輯
}
}- 注冊過濾器(Spring Boot 中)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomFilter> customFilter() {
FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CustomFilter());
bean.addUrlPatterns("/*"); // 攔截所有路徑
bean.setOrder(1); // 執(zhí)行順序
return bean;
}
}2. 攔截器 (Interceptor) 實現(xiàn)
攔截器是 Spring MVC 的組件,通過實現(xiàn) HandlerInterceptor 接口。
步驟:
- 創(chuàng)建 Interceptor 類
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 在 Controller 方法執(zhí)行前調(diào)用
System.out.println("Before Controller (Interceptor)");
return true; // true=放行, false=中斷請求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
// 在 Controller 方法執(zhí)行后、視圖渲染前調(diào)用
System.out.println("After Controller (Interceptor)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
// 在整個請求完成后調(diào)用(視圖渲染完畢)
System.out.println("After View Render (Interceptor)");
}
}- 注冊攔截器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/**") // 攔截所有路徑
.excludePathPatterns("/login"); // 排除路徑
}
}執(zhí)行順序示例
假設(shè)請求路徑被過濾器和攔截器同時攔截:
1. Filter: doFilter() [前邏輯] 2. Interceptor: preHandle() 3. Controller 方法執(zhí)行 4. Interceptor: postHandle() 5. 視圖渲染 6. Interceptor: afterCompletion() 7. Filter: doFilter() [后邏輯]
如何選擇?
| 場景 | 推薦使用 |
|---|---|
| 全局日志、字符編碼、安全過濾 | Filter |
| 權(quán)限驗證、參數(shù)預(yù)處理 | Interceptor |
| 需要 Spring 容器功能 | Interceptor |
| 非 Spring 項目 | Filter |
最佳實踐:優(yōu)先使用 Interceptor(可集成 Spring 特性),若需處理靜態(tài)資源或深度請求/響應(yīng)修改,則用 Filter。
到此這篇關(guān)于Spring中過濾器和攔截器的區(qū)別及具體實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring過濾器和攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JAVA三種攔截方式詳解(原生過濾器Filter、springMVC攔截器、aop切面)
- 淺析SpringBoot中的過濾器和攔截器
- Springboot?過濾器、攔截器、全局異常處理的方案處理小結(jié)
- SpringBoot面試突擊之過濾器和攔截器區(qū)別詳解
- Spring攔截器和過濾器的區(qū)別在哪?
- 淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件
- SpringBoot實現(xiàn)過濾器、攔截器與切片的實現(xiàn)和區(qū)別
- 詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別
相關(guān)文章
Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解
這篇文章主要介紹了Maven的porfile與SpringBoot的profile結(jié)合使用,通過maven的profile功能,在打包的時候,通過-P指定maven激活某個pofile,這個profile里面配置了一個參數(shù)activatedProperties,不同的profile里面的這個參數(shù)的值不同,需要的朋友可以參考下吧2021-12-12
Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)
這篇文章主要介紹了Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Java從配置文件中獲取參數(shù)的三種常見場景和完整示例
在 Java 中從配置文件獲取參數(shù)是開發(fā)中的常見需求,不同配置文件格式和框架有不同的實現(xiàn)方式,以下是 最常用的 3 種場景+完整示例,覆蓋原生 Java 和 Spring Boot 項目,直接復(fù)用即可,需要的朋友可以參考下2026-01-01
MybatisPlus實現(xiàn)多表的關(guān)聯(lián)查詢,實現(xiàn)分頁,多條件查詢?nèi)^程
文章介紹了如何通過商品表與供應(yīng)商表的關(guān)聯(lián)查詢,實現(xiàn)商品信息的模糊查詢,具體包括建立DAO層接口、實體類和請求參數(shù)類,編寫SQL查詢語句,以及在控制層處理查詢請求2026-03-03
Java行為型設(shè)計模式之外觀設(shè)計模式詳解
外觀模式為多個復(fù)雜的子系統(tǒng),提供了一個一致的界面,使得調(diào)用端只和這個接口發(fā)生調(diào)用,而無須關(guān)系這個子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下2022-11-11

