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

Spring中過濾器和攔截器的區(qū)別及具體實現(xiàn)方式

 更新時間:2025年07月10日 09:45:35   作者:鄧不利東  
在Spring框架中,和都是用于處理 HTTP 請求的中間件,但它們在作用范圍、實現(xiàn)方式和生命周期上有顯著區(qū)別,本文給大家介紹Spring中過濾器和攔截器的區(qū)別及具體實現(xiàn),感興趣的朋友一起看看吧

在 Spring 框架中,過濾器(Filter)攔截器(Interceptor) 都是用于處理 HTTP 請求的中間件,但它們在作用范圍、實現(xiàn)方式和生命周期上有顯著區(qū)別。以下是詳細(xì)對比和實現(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 容器
攔截時機在請求進入 Servlet 前 / 響應(yīng)發(fā)送到客戶端前在請求進入 Controller 前 / 后 / 視圖渲染后
獲取 Spring Bean不能直接獲?。ㄐ柰ㄟ^工具類)可直接獲取 Spring Bean
異常處理無法使用 Spring 的異常處理機制可結(jié)合 @ControllerAdvice 統(tǒng)一異常處理

實現(xiàn)方式

1. 過濾器 (Filter) 實現(xiàn)

過濾器是 Servlet 規(guī)范的一部分,通過實現(xiàn) javax.servlet.Filter 接口實現(xiàn)。

步驟:

  1. 創(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() {
        // 銷毀邏輯
    }
}
  1. 注冊過濾器(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) 實現(xiàn)

攔截器是 Spring MVC 的組件,通過實現(xiàn) HandlerInterceptor 接口。

步驟:

  1. 創(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) {
        // 在整個請求完成后調(diào)用(視圖渲染完畢)
        System.out.println("After View Render (Interceptor)");
    }
}
  1. 注冊攔截器
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è)請求路徑被過濾器和攔截器同時攔截:

1. Filter: doFilter() [前邏輯]
2. Interceptor: preHandle()
3. Controller 方法執(zhí)行
4. Interceptor: postHandle()
5. 視圖渲染
6. Interceptor: afterCompletion()
7. Filter: doFilter() [后邏輯]

如何選擇?

場景推薦使用
全局日志、字符編碼、安全過濾Filter
權(quán)限驗證、參數(shù)預(yù)處理Interceptor
需要 Spring 容器功能Interceptor
非 Spring 項目Filter

最佳實踐:優(yōu)先使用 Interceptor(可集成 Spring 特性),若需處理靜態(tài)資源或深度請求/響應(yīng)修改,則用 Filter。

到此這篇關(guān)于Spring中過濾器和攔截器的區(qū)別及具體實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring過濾器和攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解

    Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解

    這篇文章主要介紹了Maven的porfile與SpringBoot的profile結(jié)合使用,通過maven的profile功能,在打包的時候,通過-P指定maven激活某個pofile,這個profile里面配置了一個參數(shù)activatedProperties,不同的profile里面的這個參數(shù)的值不同,需要的朋友可以參考下吧
    2021-12-12
  • Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    這篇文章主要介紹了Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • JavaScript的基本類型值-String類型

    JavaScript的基本類型值-String類型

    String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串。在JavaScript中沒有單個的字符型,都是字符串。這篇文章主要介紹了JavaScript的基本類型值String類型,需要的朋友可以參考下
    2017-02-02
  • Sentinel初始化啟動流程詳細(xì)介紹

    Sentinel初始化啟動流程詳細(xì)介紹

    Sentinel是一個分布式系統(tǒng)的流量控制組件,它可以實現(xiàn)限流與流控及降級等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,這篇文章主要介紹了Sentinel的初始化流程,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Java使用Tesseract-Ocr識別數(shù)字

    Java使用Tesseract-Ocr識別數(shù)字

    這篇文章主要介紹了Java使用Tesseract-Ocr識別數(shù)字的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • SpringBoot整合Freemarker的基本步驟

    SpringBoot整合Freemarker的基本步驟

    這篇文章主要介紹了SpringBoot整合Freemarker的基本步驟,添加依賴及添加相關(guān)配置的實例代碼詳解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java中獲取文件大小的詳解及實例代碼

    Java中獲取文件大小的詳解及實例代碼

    這篇文章主要介紹了Java中獲取文件大小的詳解及實例代碼的相關(guān)資料,一種是使用File的length()方法,另外一種是使用FileInputStream的available()方法,這里就說下如何使用需要的朋友可以參考下
    2016-12-12
  • Java從配置文件中獲取參數(shù)的三種常見場景和完整示例

    Java從配置文件中獲取參數(shù)的三種常見場景和完整示例

    在 Java 中從配置文件獲取參數(shù)是開發(fā)中的常見需求,不同配置文件格式和框架有不同的實現(xiàn)方式,以下是 最常用的 3 種場景+完整示例,覆蓋原生 Java 和 Spring Boot 項目,直接復(fù)用即可,需要的朋友可以參考下
    2026-01-01
  • MybatisPlus實現(xiàn)多表的關(guān)聯(lián)查詢,實現(xiàn)分頁,多條件查詢?nèi)^程

    MybatisPlus實現(xiàn)多表的關(guān)聯(lián)查詢,實現(xiàn)分頁,多條件查詢?nèi)^程

    文章介紹了如何通過商品表與供應(yīng)商表的關(guān)聯(lián)查詢,實現(xiàn)商品信息的模糊查詢,具體包括建立DAO層接口、實體類和請求參數(shù)類,編寫SQL查詢語句,以及在控制層處理查詢請求
    2026-03-03
  • Java行為型設(shè)計模式之外觀設(shè)計模式詳解

    Java行為型設(shè)計模式之外觀設(shè)計模式詳解

    外觀模式為多個復(fù)雜的子系統(tǒng),提供了一個一致的界面,使得調(diào)用端只和這個接口發(fā)生調(diào)用,而無須關(guān)系這個子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下
    2022-11-11

最新評論

邳州市| 遂川县| 丹东市| 塔城市| 辽阳县| 福鼎市| 兴文县| 崇州市| 建水县| 县级市| 厦门市| 宜宾县| 武邑县| 黔东| 家居| 广德县| 鹰潭市| 新安县| 三门峡市| 东山县| 济源市| 砚山县| 五大连池市| 图片| 都兰县| 将乐县| 柳河县| 桐梓县| 安泽县| 常德市| 闽侯县| 宝丰县| 霍山县| 平阳县| 梨树县| 高青县| 杂多县| 曲麻莱县| 隆安县| 西林县| 布拖县|