在 Java Web 開發中,攔截器(Interceptor)和過濾器(Filter)是兩種常見的請求處理機制,它們用于對請求和響應進行預處理和后處理
1. 過濾器(Filter)
1.1 作用
Filter 主要用于對 請求(request) 和 響應(response) 進行預處理和后處理,通常用于請求日志記錄、編碼設置、安全檢查等場景
1.2 工作原理
- Filter 作用于 Servlet 之前,對請求進行預處理
- 處理完請求后,Filter 也可以對響應進行后處理
- 通過
FilterChain
將請求傳遞給下一個 Filter 或 Servlet
1.3 實現步驟
- 實現
javax.servlet.Filter
接口 - 重寫
doFilter
方法 - 在
web.xml
中進行配置,或者使用@WebFilter
注解
1.4 示例代碼
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 作用于所有請求
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter: 請求被攔截");chain.doFilter(request, response); // 繼續請求System.out.println("Filter: 響應被攔截");}
}
2. 攔截器(Interceptor)
2.1 作用
Interceptor 主要用于 攔截控制器(Controller)的執行,在方法執行前后或視圖渲染前執行特定邏輯,如權限控制、日志記錄、事務管理等
2.2 工作原理
- Interceptor 依賴 Spring MVC,攔截的是 Controller 的執行過程
- 可以在**方法調用前(preHandle)、方法調用后(postHandle)、視圖渲染后(afterCompletion)**執行邏輯
2.3 實現步驟
- 實現
HandlerInterceptor
接口 - 重寫
preHandle
、postHandle
、afterCompletion
方法 - 在 Spring 配置中注冊攔截器
2.4 示例代碼
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor: 進入 Controller 前");return true; // 繼續執行 Controller 方法}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor: 方法執行完畢");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor: 視圖渲染完成");}
}
2.5 攔截器的注冊
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 {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}
}
3. 過濾器與攔截器的對比
比較項 | 過濾器(Filter) | 攔截器(Interceptor) |
---|---|---|
作用范圍 | 作用于 所有請求(包括靜態資源) | 作用于 Spring MVC 控制器 |
依賴 | Servlet 規范 | Spring MVC |
觸發時機 | 在 Servlet 之前 處理請求 | 在 Controller 執行前后 處理請求 |
適用場景 | 編碼設置、日志記錄、權限控制 | 認證授權、日志、事務處理 |
處理方式 | doFilter 方法 | preHandle 、postHandle 、afterCompletion |
4. 總結
- Filter 適用于所有請求,包括靜態資源,可以用于通用的請求預處理和后處理
- Interceptor 僅攔截 Controller 方法,適用于控制器層面的攔截,如權限控制、事務管理
- 在 Spring Boot 應用中,一般推薦使用 Interceptor 來攔截業務邏輯,而使用 Filter 處理通用的請求邏輯