php網(wǎng)站和java網(wǎng)站google關(guān)鍵詞指數(shù)
文章目錄
- 過濾器和攔截器的區(qū)別詳解
- 1. 來源不同
- 2. 觸發(fā)時(shí)機(jī)不同
- 3. 實(shí)現(xiàn)原理不同
- 4. 支持的項(xiàng)目類型不同
- 5. 使用場(chǎng)景不同
- 6. 核心區(qū)別總結(jié)
- **總結(jié)**
過濾器和攔截器的區(qū)別詳解
在 Web 開發(fā)中,過濾器(Filter) 和 攔截器(Interceptor) 是兩個(gè)常見的機(jī)制,用于處理請(qǐng)求和響應(yīng)的過程。雖然它們的功能有一定的相似性,但在實(shí)現(xiàn)原理、觸發(fā)時(shí)機(jī)、適用范圍等方面存在顯著差異。本文將從多個(gè)角度詳細(xì)分析兩者的區(qū)別。
1. 來源不同
- 過濾器:屬于 Servlet 規(guī)范的一部分,依賴于 Servlet 容器。通過實(shí)現(xiàn)
javax.servlet.Filter
接口,可以對(duì)請(qǐng)求和響應(yīng)流進(jìn)行統(tǒng)一管理。它主要服務(wù)于 Web 項(xiàng)目。 - 攔截器:是 Spring 框架中的組件,依賴于 Spring 的核心功能,基于動(dòng)態(tài)代理技術(shù)實(shí)現(xiàn)。它可以不依賴 Servlet 容器,因此既可用于 Web 項(xiàng)目,也可應(yīng)用于其他 Java 項(xiàng)目。
2. 觸發(fā)時(shí)機(jī)不同
請(qǐng)求的處理流程通常為:
客戶端請(qǐng)求 → 容器 → 過濾器 → Servlet → 攔截器 → 控制器(Controller)方法 → 響應(yīng)
- 過濾器:
在請(qǐng)求進(jìn)入 Servlet 之前被觸發(fā),用于對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理和后續(xù)操作。 - 攔截器:
緊隨 Servlet 之后執(zhí)行,在請(qǐng)求進(jìn)入控制器方法前或方法后,以及整個(gè)請(qǐng)求完成后進(jìn)行處理。
這種觸發(fā)順序使得過濾器更適合處理底層的通用邏輯,而攔截器更貼近業(yè)務(wù)邏輯。
3. 實(shí)現(xiàn)原理不同
-
過濾器:
基于函數(shù)回調(diào)機(jī)制,通過調(diào)用FilterChain.doFilter()
來控制請(qǐng)求的繼續(xù)執(zhí)行。
示例代碼如下:@WebFilter(urlPatterns = "/*") public class TestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("過濾器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("請(qǐng)求進(jìn)入過濾器");chain.doFilter(request, response);System.out.println("響應(yīng)通過過濾器");}@Overridepublic void destroy() {System.out.println("過濾器銷毀");} }
-
攔截器:
基于動(dòng)態(tài)代理實(shí)現(xiàn),通過HandlerInterceptor
接口定義攔截邏輯。攔截器通常需要注冊(cè)到 Spring 配置中,執(zhí)行流程包括:preHandle
:請(qǐng)求方法執(zhí)行前調(diào)用,通常用于權(quán)限驗(yàn)證。postHandle
:方法執(zhí)行后調(diào)用,但在視圖渲染之前。afterCompletion
:整個(gè)請(qǐng)求完成后調(diào)用,用于資源清理等操作。
示例代碼:
@Component public class TestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("請(qǐng)求進(jìn)入攔截器");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("請(qǐng)求處理完成,視圖渲染前");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("請(qǐng)求完成");} }
4. 支持的項(xiàng)目類型不同
- 過濾器:依賴于 Servlet 容器,僅適用于 Web 項(xiàng)目。
- 攔截器:屬于 Spring 的核心功能,既可用于 Web 項(xiàng)目,也可在其他 Java 應(yīng)用中(如 Swing 或純 Java 項(xiàng)目)使用。
5. 使用場(chǎng)景不同
由于過濾器和攔截器觸發(fā)時(shí)機(jī)和功能上的差異,它們的應(yīng)用場(chǎng)景也有所不同:
- 過濾器的常見場(chǎng)景:
- 設(shè)置字符編碼(如 UTF-8)。
- 過濾敏感詞。
- 壓縮響應(yīng)內(nèi)容(如 Gzip)。
- 日志記錄(如記錄請(qǐng)求 IP 地址、耗時(shí)統(tǒng)計(jì)等)。
- 攔截器的常見場(chǎng)景:
- 用戶身份驗(yàn)證。
- 權(quán)限校驗(yàn)。
- 業(yè)務(wù)日志記錄。
- 數(shù)據(jù)格式轉(zhuǎn)換或預(yù)處理。
6. 核心區(qū)別總結(jié)
特性 | 過濾器(Filter) | 攔截器(Interceptor) |
---|---|---|
來源 | Servlet 規(guī)范 | Spring 框架 |
觸發(fā)時(shí)機(jī) | 在請(qǐng)求進(jìn)入 Servlet 前執(zhí)行 | 在請(qǐng)求到達(dá)控制器方法前后或完成后執(zhí)行 |
實(shí)現(xiàn)方式 | 函數(shù)回調(diào)機(jī)制,需實(shí)現(xiàn) Filter 接口 | 動(dòng)態(tài)代理機(jī)制,需實(shí)現(xiàn) HandlerInterceptor 接口 |
適用范圍 | Web 項(xiàng)目 | Web 項(xiàng)目及其他 Java 項(xiàng)目 |
典型應(yīng)用場(chǎng)景 | 字符編碼設(shè)置、數(shù)據(jù)壓縮等通用功能 | 用戶認(rèn)證、權(quán)限校驗(yàn)等業(yè)務(wù)邏輯 |
總結(jié)
過濾器和攔截器雖然都可以對(duì)請(qǐng)求進(jìn)行處理,但在實(shí)現(xiàn)原理、觸發(fā)時(shí)機(jī)、適用范圍和使用場(chǎng)景上有顯著差異。過濾器更適合底層功能的實(shí)現(xiàn),而攔截器更貼近業(yè)務(wù)需求。開發(fā)者可以根據(jù)項(xiàng)目需求選擇合適的工具,充分發(fā)揮二者的優(yōu)勢(shì)。
博客主頁: 總是學(xué)不會(huì).