Spring中過濾器和攔截器的區(qū)別及具體實(shí)現(xiàn)方式
在 Spring 框架中,過濾器(Filter) 和 攔截器(Interceptor) 都是用于處理 HTTP 請求的中間件,但它們在作用范圍、實(shí)現(xiàn)方式和生命周期上有顯著區(qū)別。以下是詳細(xì)對比和實(shí)現(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 容器 |
| 攔截時(shí)機(jī) | 在請求進(jìn)入 Servlet 前 / 響應(yīng)發(fā)送到客戶端前 | 在請求進(jìn)入 Controller 前 / 后 / 視圖渲染后 |
| 獲取 Spring Bean | 不能直接獲?。ㄐ柰ㄟ^工具類) | 可直接獲取 Spring Bean |
| 異常處理 | 無法使用 Spring 的異常處理機(jī)制 | 可結(jié)合 @ControllerAdvice 統(tǒng)一異常處理 |
實(shí)現(xiàn)方式
1. 過濾器 (Filter) 實(shí)現(xiàn)
過濾器是 Servlet 規(guī)范的一部分,通過實(shí)現(xiàn) javax.servlet.Filter 接口實(shí)現(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) 實(shí)現(xiàn)
攔截器是 Spring MVC 的組件,通過實(shí)現(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) {
// 在整個(gè)請求完成后調(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è)請求路徑被過濾器和攔截器同時(shí)攔截:
1. Filter: doFilter() [前邏輯] 2. Interceptor: preHandle() 3. Controller 方法執(zhí)行 4. Interceptor: postHandle() 5. 視圖渲染 6. Interceptor: afterCompletion() 7. Filter: doFilter() [后邏輯]
如何選擇?
| 場景 | 推薦使用 |
|---|---|
| 全局日志、字符編碼、安全過濾 | Filter |
| 權(quán)限驗(yàn)證、參數(shù)預(yù)處理 | Interceptor |
| 需要 Spring 容器功能 | Interceptor |
| 非 Spring 項(xiàng)目 | Filter |
最佳實(shí)踐:優(yōu)先使用 Interceptor(可集成 Spring 特性),若需處理靜態(tài)資源或深度請求/響應(yīng)修改,則用 Filter。
到此這篇關(guān)于Spring中過濾器和攔截器的區(qū)別及具體實(shí)現(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實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別
- 詳談springboot過濾器和攔截器的實(shí)現(xiàn)及區(qū)別
相關(guān)文章
用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子
這篇文章主要介紹了用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子,這里Java的微信SDK等部分便不再詳述,只注重關(guān)鍵部分和開發(fā)過程中觀察者模式優(yōu)點(diǎn)的體現(xiàn),需要的朋友可以參考下2016-02-02
IDEA查看所有的斷點(diǎn)(Breakpoints)并關(guān)閉的方式
我們在使用IDEA開發(fā)Java應(yīng)用時(shí),基本上都需要進(jìn)行打斷點(diǎn)的操作,這方便我們排查BUG,也方便我們查看設(shè)計(jì)的是否正確,不過有時(shí)候,我們不希望進(jìn)入斷點(diǎn),所以我們需要快速關(guān)閉所有斷點(diǎn),故本文給大家介紹了IDEA查看所有的斷點(diǎn)(Breakpoints)并關(guān)閉的方式2024-10-10
Java線程池ThreadPoolExecutor源碼深入分析
ThreadPoolExecutor作為java.util.concurrent包對外提供基礎(chǔ)實(shí)現(xiàn),以內(nèi)部線程池的形式對外提供管理任務(wù)執(zhí)行,線程調(diào)度,線程池管理等等服務(wù)2022-08-08
Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼
本文主要介紹了Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
通過實(shí)例解析Java類初始化和實(shí)例初始化
這篇文章主要介紹了通過實(shí)例解析Java類初始化和實(shí)例初始化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11

