欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot中的攔截器和過濾器的作用、區(qū)別解析

 更新時(shí)間:2025年09月17日 10:22:45   作者:bindabin  
這篇文章主要介紹了springboot中的攔截器和過濾器的作用、區(qū)別解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

一、作用

1. 過濾器 (Filter)

  • 歸屬:過濾器是 Java Servlet 規(guī)范 規(guī)定的標(biāo)準(zhǔn),屬于 Web 服務(wù)器層面的技術(shù)。任何 Java Web 工程(包括 Spring Boot)都可以使用它。
  • 作用:過濾器用于在請(qǐng)求進(jìn)入 Web 應(yīng)用程序(Servlet)之前響應(yīng)離開應(yīng)用程序之后執(zhí)行預(yù)處理和后處理。它的核心作用是對(duì) HTTP 請(qǐng)求和響應(yīng)進(jìn)行過濾
  • 典型應(yīng)用場(chǎng)景
    • 解決全局的跨域問題(CORS)
    • 字符編碼設(shè)置(CharacterEncodingFilter
    • 敏感詞過濾、非法請(qǐng)求攔截
    • 通用的日志記錄、性能監(jiān)控(記錄請(qǐng)求耗時(shí))
    • 權(quán)限校驗(yàn)(簡(jiǎn)單邏輯,不依賴于 Spring 容器)

2. 攔截器 (Interceptor)

  • 歸屬:攔截器是 Spring MVC 框架 自身的組件,它深度集成于 Spring 上下文(ApplicationContext)。
  • 作用:攔截器用于在請(qǐng)求進(jìn)入 Spring MVC 的控制器 (Controller) 之前、控制器方法執(zhí)行之后 以及視圖渲染完畢之后 這三個(gè)關(guān)鍵點(diǎn)進(jìn)行攔截處理。它的核心作用是對(duì)控制器級(jí)別的請(qǐng)求進(jìn)行更精細(xì)化的處理。
  • 典型應(yīng)用場(chǎng)景
    • 登錄狀態(tài)校驗(yàn)和權(quán)限驗(yàn)證(最常用)
    • 日志記錄(記錄 Controller 方法的入?yún)ⅰ⒊鰠⒌龋?/li>
    • 通用數(shù)據(jù)的預(yù)處理(如從 cookie/token 中解析用戶信息并放入模型)
    • 方法執(zhí)行時(shí)間的計(jì)算

二、執(zhí)行順序與位置(核心區(qū)別)

這是理解兩者區(qū)別最直觀的方式。一個(gè) HTTP 請(qǐng)求的處理流程如下:

HTTP Request -> Tomcat -> Filter -> DispatcherServlet -> Interceptor -> Controller -> Interceptor -> Filter -> HTTP Response

  1. 請(qǐng)求到達(dá):HTTP 請(qǐng)求首先被 Tomcat 等 Servlet 容器接收。
  2. 過濾器 (Filter):請(qǐng)求會(huì)依次經(jīng)過配置的過濾器鏈(Filter Chain)。在這里,過濾器可以對(duì)請(qǐng)求進(jìn)行“預(yù)處理”。
  3. 進(jìn)入 Spring:請(qǐng)求通過過濾器后,到達(dá) Spring MVC 的核心——DispatcherServlet
  4. 攔截器 (Interceptor)DispatcherServlet 會(huì)根據(jù)請(qǐng)求路徑找到對(duì)應(yīng)的 Handler(即Controller方法),但在執(zhí)行之前,會(huì)先經(jīng)過配置的攔截器鏈(Interceptor Chain)的 preHandle 方法。
  5. 執(zhí)行控制器:如果所有攔截器的 preHandle 都返回 true,則執(zhí)行真正的 Controller 方法。
  6. 后處理:Controller 方法執(zhí)行完畢后,會(huì)依次經(jīng)過攔截器鏈的 postHandle 方法(視圖渲染前)。
  7. 視圖渲染:進(jìn)行視圖渲染(如果是 MVC 模式)。
  8. 最終處理:視圖渲染完成后(或完成后),會(huì)執(zhí)行攔截器鏈的 afterCompletion 方法(請(qǐng)求完成后,可用于資源清理)。
  9. 返回響應(yīng):處理后的響應(yīng)再次經(jīng)過過濾器鏈,過濾器可以對(duì)響應(yīng)進(jìn)行“后處理”。
  10. 響應(yīng)返回:最終,響應(yīng)通過 Tomcat 返回給客戶端。

簡(jiǎn)單比喻

  • 過濾器:相當(dāng)于小區(qū)的大門保安,對(duì)所有進(jìn)出小區(qū)(Web應(yīng)用)的人和物(HTTP請(qǐng)求/響應(yīng))進(jìn)行宏觀檢查。
  • 攔截器:相當(dāng)于樓下的單元門禁,只對(duì)進(jìn)入你這棟樓(Spring MVC控制器)的人進(jìn)行更具體的檢查和登記。

三、區(qū)別與聯(lián)系總結(jié)

特性過濾器 (Filter)攔截器 (Interceptor)
歸屬規(guī)范/框架Servlet 規(guī)范 (javax.servlet)Spring MVC 框架 (org.springframework.web.servlet)
依賴關(guān)系不依賴 Spring 容器,在 Web 服務(wù)器中運(yùn)行強(qiáng)烈依賴 Spring 容器,可以調(diào)用 Spring 中的任何 Bean(如 Service)
作用范圍作用于所有請(qǐng)求(包括靜態(tài)資源,如 /css/, /js/只作用于進(jìn)入 Spring MVC 控制器的請(qǐng)求(通常由 DispatcherServlet 處理)
獲取 Bean無法直接注入 Spring Bean,需要通過其他方式(如 Spring 工具類)可以方便地使用 @Autowired 注入 Spring Bean
實(shí)現(xiàn)方式實(shí)現(xiàn) javax.servlet.Filter 接口,重寫 doFilter 方法實(shí)現(xiàn) HandlerInterceptor 接口,重寫 preHandle, postHandle, afterCompletion
控制粒度較粗,基于 ServletRequest 和 ServletResponse較細(xì),可以獲取到處理請(qǐng)求的控制器方法(HandlerMethod) 等信息
執(zhí)行時(shí)機(jī)在 Servlet 之前和之后執(zhí)行在 Controller 方法之前、之后、以及視圖渲染完成后執(zhí)行
異常處理在過濾器中發(fā)生的異常,可以在過濾鏈中進(jìn)行處理在攔截器中發(fā)生的異常,可以被 Spring 的全局異常處理器(@ControllerAdvice)捕獲

聯(lián)系

  1. 功能相似:兩者都實(shí)現(xiàn)了“橫切關(guān)注點(diǎn)”的功能,用于實(shí)現(xiàn)與業(yè)務(wù)邏輯無關(guān)的通用功能(如日志、安全)。
  2. 執(zhí)行順序協(xié)作:它們?cè)谕淮握?qǐng)求處理流程中協(xié)同工作,過濾器在外層,攔截器在內(nèi)層。

四、代碼示例

1. 過濾器 (Filter) 示例

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 使用注解注冊(cè)過濾器,并指定過濾的 URL 模式
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        System.out.println("Filter: 請(qǐng)求預(yù)處理 - 設(shè)置字符編碼");
        // 設(shè)置請(qǐng)求和響應(yīng)編碼
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 繼續(xù)執(zhí)行過濾器鏈,最終會(huì)到達(dá) Servlet
        chain.doFilter(request, response);
        // 響應(yīng)后處理
        long endTime = System.currentTimeMillis();
        System.out.println("Filter: 響應(yīng)后處理 - 請(qǐng)求耗時(shí): " + (endTime - startTime) + "ms");
    }
    // ... 其他 init 和 destroy 方法
}

注意:在 Spring Boot 中,通常使用 @Component 或配置類來注冊(cè) Filter,@WebFilter 有時(shí)需要與 @ServletComponentScan 配合使用。

2. 攔截器 (Interceptor) 示例

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor: preHandle - 在控制器方法執(zhí)行之前");
        // 登錄校驗(yàn)邏輯
        // if (!isLogin(request)) {
        //     response.sendRedirect("/login");
        //     return false; // 中斷執(zhí)行,不會(huì)到達(dá) Controller
        // }
        System.out.println("用戶已登錄,放行");
        return true; // 繼續(xù)執(zhí)行,到達(dá) Controller
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor: postHandle - 控制器方法執(zhí)行完畢,視圖渲染之前");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor: afterCompletion - 整個(gè)請(qǐng)求已完成,視圖已渲染");
        // 資源清理等工作
    }
}

還需要一個(gè)配置類來注冊(cè)攔截器并指定攔截路徑:

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 WebConfig implements WebMvcConfigurer {
    @Autowired
    private MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**") // 攔截所有 /api 開頭的路徑
                .excludePathPatterns("/api/login"); // 排除登錄接口
    }
}

五、如何選擇?

  • 使用過濾器 (Filter) 當(dāng):你的功能與 Spring 無關(guān)(例如,處理靜態(tài)資源),或者你需要處理非常底層的 ServletRequest/ServletResponse 對(duì)象(如包裝請(qǐng)求體),或者你的邏輯非常通用且不需要 Spring 容器的支持。
  • 使用攔截器 (Interceptor) 當(dāng):你的功能需要與 Spring MVC 深度集成,例如需要訪問 HandlerMethod 信息、需要注入 Spring Bean(如 Service 來進(jìn)行權(quán)限校驗(yàn))、或者你的攔截邏輯只針對(duì)進(jìn)入控制器的業(yè)務(wù)請(qǐng)求。

在大多數(shù)基于 Spring Boot 的業(yè)務(wù)開發(fā)中,攔截器是更常用和更強(qiáng)大的選擇,尤其是處理權(quán)限、日志等業(yè)務(wù)相關(guān)切面。

到此這篇關(guān)于java springboot中的攔截器和過濾器的作用、區(qū)別和聯(lián)系的文章就介紹到這了,更多相關(guān)springboot攔截器和過濾器區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用RandomAccessFile類對(duì)文件進(jìn)行讀寫

    Java使用RandomAccessFile類對(duì)文件進(jìn)行讀寫

    本篇文章主要介紹了Java使用RandomAccessFile類對(duì)文件進(jìn)行讀寫,詳細(xì)的介紹了RandomAccessFile類的使用技巧和實(shí)例應(yīng)用,有興趣的可以了解一下
    2017-04-04
  • Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對(duì)象接收

    Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對(duì)象接收

    這篇文章主要介紹了Springmvc發(fā)送json數(shù)據(jù)轉(zhuǎn)Java對(duì)象接收,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例

    SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例

    樂觀鎖是一種用于解決并發(fā)沖突的機(jī)制,在數(shù)據(jù)庫中用于保護(hù)數(shù)據(jù)的一致性,本文主要介紹了SpringBoot+MyBatisPlus中樂觀鎖的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Java計(jì)算兩個(gè)程序運(yùn)行時(shí)間的實(shí)例

    Java計(jì)算兩個(gè)程序運(yùn)行時(shí)間的實(shí)例

    下面小編就為大家?guī)硪黄狫ava計(jì)算兩個(gè)程序運(yùn)行時(shí)間的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 面試初級(jí)Java開發(fā)問到Arrays

    面試初級(jí)Java開發(fā)問到Arrays

    這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實(shí)例形式分析了java Arrays工具類針對(duì)數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • shiro與spring集成基礎(chǔ)Hello案例詳解

    shiro與spring集成基礎(chǔ)Hello案例詳解

    這篇文章主要介紹了shiro與spring集成基礎(chǔ)Hello案例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 2023年IDEA最新永久激活教程(親測(cè)可用)

    2023年IDEA最新永久激活教程(親測(cè)可用)

    打開電腦,發(fā)現(xiàn)?IDEA?又更新了一個(gè)小版本,2022.3.2?版本來了,真的是非常高興,那么這么新的版本怎么激活使用呢?下面小編給大家?guī)砹薸dea2023年最新永久激活方法,感興趣的朋友一起看看吧
    2023-04-04
  • Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    這篇文章主要介紹了Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析,List是有序集合的根接口,Set是無序集合的根接口,無序也就意味著元素不重復(fù),更嚴(yán)格地說,Set集合不包含一對(duì)元素e1和e2 ,使得e1.equals(e2) ,并且最多一個(gè)空元素,需要的朋友可以參考下
    2023-09-09
  • Springboot打包部署修改配置文件的方法

    Springboot打包部署修改配置文件的方法

    這篇文章主要介紹了Springboot打包部署修改配置文件的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java關(guān)于String.split("|")的使用方式

    java關(guān)于String.split("|")的使用方式

    這篇文章主要介紹了java關(guān)于String.split("|")的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論