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

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

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

在 Spring 框架中,過濾器(Filter)攔截器(Interceptor) 都是用于處理 HTTP 請求的中間件,但它們在作用范圍、實(shí)現(xiàn)方式和生命周期上有顯著區(qū)別。以下是詳細(xì)對比和實(shí)現(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 容器
攔截時(shí)機(jī)在請求進(jìn)入 Servlet 前 / 響應(yīng)發(fā)送到客戶端前在請求進(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. 請求到達(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) 實(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=中斷請求
    }
    @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è)請求完成后調(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è)請求路徑被過濾器和攔截器同時(shí)攔截:

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

如何選擇?

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

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

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

相關(guān)文章

  • 用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子

    用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子

    這篇文章主要介紹了用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子,這里Java的微信SDK等部分便不再詳述,只注重關(guān)鍵部分和開發(fā)過程中觀察者模式優(yōu)點(diǎn)的體現(xiàn),需要的朋友可以參考下
    2016-02-02
  • IDEA查看所有的斷點(diǎn)(Breakpoints)并關(guān)閉的方式

    IDEA查看所有的斷點(diǎn)(Breakpoints)并關(guān)閉的方式

    我們在使用IDEA開發(fā)Java應(yīng)用時(shí),基本上都需要進(jìn)行打斷點(diǎn)的操作,這方便我們排查BUG,也方便我們查看設(shè)計(jì)的是否正確,不過有時(shí)候,我們不希望進(jìn)入斷點(diǎn),所以我們需要快速關(guān)閉所有斷點(diǎn),故本文給大家介紹了IDEA查看所有的斷點(diǎn)(Breakpoints)并關(guān)閉的方式
    2024-10-10
  • springboot之聯(lián)表查詢方式

    springboot之聯(lián)表查詢方式

    這篇文章主要介紹了springboot之聯(lián)表查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java多線程繼承Thread類詳解

    Java多線程繼承Thread類詳解

    Java多線程的兩種實(shí)現(xiàn)方式:繼承Thread類 & 實(shí)現(xiàn)Runable接口,今天我們來學(xué)習(xí)下繼承Thread類,希望大家能夠喜歡
    2016-06-06
  • java String 可變性的分析

    java String 可變性的分析

    這篇文章主要介紹了java String 可變性的分析的相關(guān)資料,通常大家都認(rèn)為java String 是不可變的,這里分析下源碼來說明它的可變性,需要的朋友可以參考下
    2017-03-03
  • Java線程池ThreadPoolExecutor源碼深入分析

    Java線程池ThreadPoolExecutor源碼深入分析

    ThreadPoolExecutor作為java.util.concurrent包對外提供基礎(chǔ)實(shí)現(xiàn),以內(nèi)部線程池的形式對外提供管理任務(wù)執(zhí)行,線程調(diào)度,線程池管理等等服務(wù)
    2022-08-08
  • 我賭你不清楚Spring中關(guān)于Null的這些事

    我賭你不清楚Spring中關(guān)于Null的這些事

    這篇文章主要介紹了我賭你不清楚Spring中關(guān)于Null的這些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼

    Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼

    本文主要介紹了Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • SpringBoot中VO/DTO/PO的具體使用

    SpringBoot中VO/DTO/PO的具體使用

    VO/DTO/PO等實(shí)體類中字段常常會存在多數(shù)相同,根據(jù)業(yè)務(wù)需求少數(shù)不同,本文主要介紹了SpringBoot中VO/DTO/PO的具體使用,感興趣的可以了解一下
    2024-03-03
  • 通過實(shí)例解析Java類初始化和實(shí)例初始化

    通過實(shí)例解析Java類初始化和實(shí)例初始化

    這篇文章主要介紹了通過實(shí)例解析Java類初始化和實(shí)例初始化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評論