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

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

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

在 Spring 框架中,過濾器(Filter)攔截器(Interceptor) 都是用于處理 HTTP 請(qǐng)求的中間件,但它們?cè)谧饔梅秶?、?shí)現(xiàn)方式和生命周期上有顯著區(qū)別。以下是詳細(xì)對(duì)比和實(shí)現(xiàn)方式:

核心區(qū)別

特性過濾器 (Filter)攔截器 (Interceptor)
規(guī)范Servlet 規(guī)范 (J2EE 標(biāo)準(zhǔn))Spring 框架特有
作用范圍所有 Web 資源(Servlet、JSP、靜態(tài)資源)僅 Spring MVC 管理的 Controller 請(qǐng)求
依賴依賴 Servlet 容器(如 Tomcat)依賴 Spring 容器
攔截時(shí)機(jī)在請(qǐng)求進(jìn)入 Servlet 前 / 響應(yīng)發(fā)送到客戶端前在請(qǐng)求進(jìn)入 Controller 前 / 后 / 視圖渲染后
獲取 Spring Bean不能直接獲?。ㄐ柰ㄟ^工具類)可直接獲取 Spring Bean
異常處理無法使用 Spring 的異常處理機(jī)制可結(jié)合 @ControllerAdvice 統(tǒng)一異常處理

實(shí)現(xiàn)方式

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

過濾器是 Servlet 規(guī)范的一部分,通過實(shí)現(xiàn) javax.servlet.Filter 接口實(shí)現(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. 請(qǐng)求到達(dá) Controller 前的邏輯
        System.out.println("Before Controller (Filter)");
        // 放行請(qǐng)求
        chain.doFilter(request, response);
        // 2. 響應(yīng)返回客戶端前的邏輯
        System.out.println("After Controller (Filter)");
    }
    @Override
    public void destroy() {
        // 銷毀邏輯
    }
}
  1. 注冊(cè)過濾器(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) 實(shí)現(xiàn)

攔截器是 Spring MVC 的組件,通過實(shí)現(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=中斷請(qǐng)求
    }
    @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) {
        // 在整個(gè)請(qǐng)求完成后調(diào)用(視圖渲染完畢)
        System.out.println("After View Render (Interceptor)");
    }
}
  1. 注冊(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 InterceptorConfig implements WebMvcConfigurer {
    @Autowired
    private CustomInterceptor customInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/**")    // 攔截所有路徑
                .excludePathPatterns("/login"); // 排除路徑
    }
}

執(zhí)行順序示例

假設(shè)請(qǐng)求路徑被過濾器和攔截器同時(shí)攔截:

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

如何選擇?

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

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

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

相關(guān)文章

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

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

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

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

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

    JavaScript的基本類型值-String類型

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

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

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

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

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

    SpringBoot整合Freemarker的基本步驟

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

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

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

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

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

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

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

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

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

最新評(píng)論

太仆寺旗| 绥芬河市| 嘉定区| 西藏| 盐津县| 禄丰县| 正蓝旗| 介休市| 长治县| 伊宁市| 商水县| 东丽区| 万源市| 凉城县| 民县| 金沙县| 门源| 呼玛县| 鹿邑县| 济阳县| 务川| 溧阳市| 临湘市| 桃源县| 嘉荫县| 彰武县| 曲松县| 伊金霍洛旗| 聂荣县| 伊金霍洛旗| 揭阳市| 北宁市| 宁陕县| 昭觉县| 广平县| 左权县| 团风县| 永胜县| 奈曼旗| 遂平县| 金山区|