最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、作用

1. 過濾器 (Filter)

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

2. 攔截器 (Interceptor)

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

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

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

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

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

簡單比喻

  • 過濾器:相當(dāng)于小區(qū)的大門保安,對所有進(jìn)出小區(qū)(Web應(yīng)用)的人和物(HTTP請求/響應(yīng))進(jìn)行宏觀檢查。
  • 攔截器:相當(dāng)于樓下的單元門禁,只對進(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)
作用范圍作用于所有請求(包括靜態(tài)資源,如 /css/, /js/只作用于進(jìn)入 Spring MVC 控制器的請求(通常由 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ì),可以獲取到處理請求的控制器方法(HandlerMethod) 等信息
執(zhí)行時機(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é)作:它們在同一次請求處理流程中協(xié)同工作,過濾器在外層,攔截器在內(nèi)層。

四、代碼示例

1. 過濾器 (Filter) 示例

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 使用注解注冊過濾器,并指定過濾的 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: 請求預(yù)處理 - 設(shè)置字符編碼");
        // 設(shè)置請求和響應(yīng)編碼
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 繼續(xù)執(zhí)行過濾器鏈,最終會到達(dá) Servlet
        chain.doFilter(request, response);
        // 響應(yīng)后處理
        long endTime = System.currentTimeMillis();
        System.out.println("Filter: 響應(yīng)后處理 - 請求耗時: " + (endTime - startTime) + "ms");
    }
    // ... 其他 init 和 destroy 方法
}

注意:在 Spring Boot 中,通常使用 @Component 或配置類來注冊 Filter,@WebFilter 有時需要與 @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í)行,不會到達(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 - 整個請求已完成,視圖已渲染");
        // 資源清理等工作
    }
}

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

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 對象(如包裝請求體),或者你的邏輯非常通用且不需要 Spring 容器的支持。
  • 使用攔截器 (Interceptor) 當(dāng):你的功能需要與 Spring MVC 深度集成,例如需要訪問 HandlerMethod 信息、需要注入 Spring Bean(如 Service 來進(jìn)行權(quán)限校驗(yàn))、或者你的攔截邏輯只針對進(jìn)入控制器的業(yè)務(wù)請求。

在大多數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中多配置文件及引用其他bean的方式

    Spring中多配置文件及引用其他bean的方式

    本文給大家介紹spring中多配置文件及引用其他bean的方式,涉及到spring配置文件的相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Spring MVC處理參數(shù)中的枚舉類型通用實(shí)現(xiàn)方法

    Spring MVC處理參數(shù)中的枚舉類型通用實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC處理參數(shù)中的枚舉類型通用實(shí)現(xiàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-11-11
  • Java如何獲取一個IP段內(nèi)的所有IP地址

    Java如何獲取一個IP段內(nèi)的所有IP地址

    這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)起始和結(jié)束的IP地址獲取IP段內(nèi)所有IP地址,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 解決Springboot get請求是參數(shù)過長的情況

    解決Springboot get請求是參數(shù)過長的情況

    這篇文章主要介紹了解決Springboot get請求是參數(shù)過長的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    這篇文章主要介紹了Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 使用IDEA直接連接MySQL數(shù)據(jù)庫的方法

    使用IDEA直接連接MySQL數(shù)據(jù)庫的方法

    這篇文章主要介紹了如何使用IDEA直接連接MySQL數(shù)據(jù)庫,首先需要新建一個空項(xiàng)目,第一次連接 需要先下載驅(qū)動,文中給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 說說字符串轉(zhuǎn) OffSetDateTime 你真的會用嗎

    說說字符串轉(zhuǎn) OffSetDateTime 你真的會用嗎

    這篇文章主要介紹了字符串轉(zhuǎn) OffSetDateTime 你真的會用嗎?具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring整合CXF webservice restful實(shí)例詳解

    Spring整合CXF webservice restful實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring整合CXF webservice restful的實(shí)例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串2種方法

    java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串2種方法

    在我們?nèi)粘i_發(fā)中,在前后端交互的時候會遇到多個id或其他字段存放到一個字段中,這時我們會遇到一個List(集合)---->String(單個字段),這篇文章主要給大家介紹了關(guān)于java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串的2種方法,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于struts2中Action名字的大小寫問題淺談

    關(guān)于struts2中Action名字的大小寫問題淺談

    這篇文章主要給大家介紹了關(guān)于struts2中Action名字大小寫問題的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06

最新評論

鲁甸县| 桂平市| 黔西县| 甘肃省| 什邡市| 武夷山市| 高青县| 沙湾县| 罗江县| 沙雅县| 霍州市| 临湘市| 丹巴县| 邮箱| 泰宁县| 连平县| 谢通门县| 关岭| 崇礼县| 滦平县| 玛曲县| 岢岚县| 兴和县| 崇左市| 青阳县| 安福县| 宿迁市| 富阳市| 巴马| 云龙县| 波密县| 寿宁县| 芒康县| 苏尼特左旗| 襄汾县| 札达县| 浏阳市| 瑞安市| 汉寿县| 石嘴山市| 凤阳县|