亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Boot攔截器Interceptor與過濾器Filter詳細教程(示例詳解)

 更新時間:2025年03月17日 14:44:14   作者:蹦跑的蝸牛  
本文詳細介紹了SpringBoot中的攔截器(Interceptor)和過濾器(Filter),包括它們的定義、作用范圍、使用場景、實現(xiàn)步驟、執(zhí)行順序、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧

Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程

1. 概述

1.1 什么是攔截器(Interceptor)?

攔截器是 Spring MVC 框架的組件,基于 AOP(面向切面編程) 實現(xiàn)。它允許在請求處理的不同階段(如Controller方法執(zhí)行前后)插入自定義邏輯。

1.2 什么是過濾器(Filter)?

過濾器是 Java Servlet規(guī)范 定義的組件,作用于所有進入容器的請求(如Tomcat)。它可以在請求到達Servlet前或響應(yīng)返回客戶端前進行預(yù)處理和后處理。

1.3 核心區(qū)別

特性攔截器(Interceptor)過濾器(Filter)
所屬框架Spring MVCServlet API
作用范圍僅Spring MVC管理的請求所有請求(包括靜態(tài)資源)
依賴依賴Spring容器依賴Servlet容器(如Tomcat)
執(zhí)行時機Controller方法前后Servlet處理前后
獲取Bean支持(通過Spring上下文)不支持(需通過其他方式注入)

2. 使用場景

2.1 攔截器的典型應(yīng)用

  • 日志記錄:記錄請求參數(shù)、響應(yīng)時間。
  • 權(quán)限驗證:檢查用戶是否登錄或擁有權(quán)限。
  • 事務(wù)管理:在Controller方法前后開啟/提交事務(wù)。
  • 性能監(jiān)控:統(tǒng)計接口耗時。

2.2 過濾器的典型應(yīng)用

  • 全局字符編碼:統(tǒng)一設(shè)置請求/響應(yīng)的編碼(如UTF-8)。
  • 跨域處理:添加CORS響應(yīng)頭。
  • XSS防御:過濾請求參數(shù)中的惡意腳本。
  • 請求壓縮:對響應(yīng)內(nèi)容進行GZIP壓縮。

3. 實現(xiàn)步驟

3.1 創(chuàng)建攔截器

步驟:

實現(xiàn) HandlerInterceptor 接口,重寫以下方法:

  • preHandle():在Controller方法執(zhí)行前調(diào)用。
  • postHandle():在Controller方法執(zhí)行后、視圖渲染前調(diào)用。
  • afterCompletion():在請求完成后調(diào)用(視圖渲染后)。

注冊攔截器到Spring MVC配置。

代碼示例:

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 檢查用戶是否登錄
        if (request.getSession().getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false; // 中斷請求
        }
        return true;
    }
}

注冊攔截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/static/**");
    }
}

注冊多個攔截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 第一個攔截器:日志(優(yōu)先級高)
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/**")       // 攔截所有路徑
                .excludePathPatterns("/static/**"); // 排除靜態(tài)資源
        // 第二個攔截器:權(quán)限(優(yōu)先級低)
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**");  // 僅攔截/api路徑
    }
}

關(guān)鍵配置選項

配置方法說明
addPathPatterns("/api")指定攔截的路徑(支持Ant風(fēng)格)
excludePathPatterns("/login")排除特定路徑
order(1)顯式設(shè)置順序(默認按注冊順序)

若要手動指定順序,可添加:

registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);

3.2 創(chuàng)建過濾器

步驟:

  • 實現(xiàn) javax.servlet.Filter 接口,重寫 doFilter 方法。
  • 注冊過濾器到Servlet容器(通過注解或配置類)。

代碼示例:

@WebFilter(urlPatterns = "/*")
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        System.out.println("請求開始: " + ((HttpServletRequest) request).getRequestURI());
        chain.doFilter(request, response); // 繼續(xù)執(zhí)行后續(xù)過濾器或Servlet
        System.out.println("請求結(jié)束");
    }
}

注冊過濾器(若未使用@WebFilter):

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LoggingFilter> loggingFilter() {
        FilterRegistrationBean<LoggingFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new LoggingFilter());
        bean.addUrlPatterns("/*");
        bean.setOrder(1); // 設(shè)置執(zhí)行順序
        return bean;
    }
}

注意: 確保主類添加 @ServletComponentScan 以啟用 @WebFilter 注解。

4. 執(zhí)行順序與流程

4.1 執(zhí)行順序

  • 過濾器(FilterChain) → 2. 攔截器(preHandle) → 3. Controller方法 → 4. 攔截器(postHandle) → 5. 視圖渲染 → 6. 攔截器(afterCompletion) → 7. 過濾器后續(xù)處理

4.2 流程圖

客戶端 → Filter.doFilter() → Interceptor.preHandle()
       → Controller → Interceptor.postHandle()
       → 視圖渲染 → Interceptor.afterCompletion()
       → Filter.doFilter()后續(xù)處理 → 客戶端

5. 常見問題與解決方案

Q1:如何控制多個攔截器/過濾器的執(zhí)行順序?

  • 攔截器:通過 registry.addInterceptor() 的順序決定。
  • 過濾器:通過 FilterRegistrationBean.setOrder() 設(shè)置優(yōu)先級(值越小越先執(zhí)行)。

Q2:攔截器中如何獲取Spring管理的Bean?

直接從Spring容器注入:

public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private UserService userService; // 直接注入
}

Q3:過濾器中如何修改請求參數(shù)?

通過自定義 HttpServletRequestWrapper

public class ModifyRequestWrapper extends HttpServletRequestWrapper {
    // 重寫getParameter等方法以修改參數(shù)
}
// 在Filter中替換Request對象
chain.doFilter(new ModifyRequestWrapper(request), response);

Q4:攔截器和過濾器執(zhí)行時出現(xiàn)異常如何處理?

  • 攔截器:在 afterCompletion 中處理異常。
  • 過濾器:使用 try-catch 包裹 chain.doFilter()。

Q5:如何讓某個攔截器全局生效?

使用 addPathPatterns("/**")

registry.addInterceptor(new LogInterceptor())
        .addPathPatterns("/**");

Q6:如何跳過特定攔截器的執(zhí)行?

preHandle 中返回 false

@Override
public boolean preHandle(...) {
    if (跳過條件) {
        return false; // 后續(xù)攔截器和Controller不會執(zhí)行
    }
    return true;
}

Q7:攔截器之間如何共享數(shù)據(jù)?

通過 request.setAttribute 傳遞:

// 在第一個攔截器中存儲數(shù)據(jù)
request.setAttribute("key", "value");
// 在后續(xù)攔截器中獲取
String value = (String) request.getAttribute("key");

6. 總結(jié)

選擇攔截器還是過濾器?

  • 需要訪問Spring上下文或Controller信息 → 攔截器。
  • 需處理所有請求(包括靜態(tài)資源) → 過濾器。

最佳實踐

  • 優(yōu)先使用攔截器處理業(yè)務(wù)相關(guān)邏輯。
  • 使用過濾器處理底層Servlet容器的任務(wù)(如編碼、壓縮)。

到此這篇關(guān)于Spring Boot攔截器(Interceptor)與過濾器(Filter)詳細教程的文章就介紹到這了,更多相關(guān)Spring Boot攔截器與過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何實現(xiàn)java執(zhí)行kettle并傳參數(shù)

    如何實現(xiàn)java執(zhí)行kettle并傳參數(shù)

    文章主要介紹了在審批成功后如何使用Kettle傳遞批次號參數(shù)并執(zhí)行KTR文件,同時,提到了所需的主要POM依賴,并強調(diào)了個人經(jīng)驗的價值,鼓勵大家參考和使用
    2025-01-01
  • 詳解SpringBoot自動配置源碼

    詳解SpringBoot自動配置源碼

    今天帶大家來分析SpringBoot自動配置源碼,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 通俗講解JVM的類加載機制

    通俗講解JVM的類加載機制

    這篇文章主要介紹了JVM的類加載機制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • restTemplate未設(shè)置連接數(shù)導(dǎo)致服務(wù)雪崩問題以及解決

    restTemplate未設(shè)置連接數(shù)導(dǎo)致服務(wù)雪崩問題以及解決

    面對線上問題,仔細分析原因,及時調(diào)整配置,能有效解決問題,本文詳細描述了線上遇到流量突增引發(fā)的問題,通過查看代碼和連接池信息,分析出問題的原因是連接池滿了,連接池大小配置不足以應(yīng)對大并發(fā)流量,通過調(diào)整連接池大小配置
    2024-10-10
  • java+jdbc+mysql+socket搭建局域網(wǎng)聊天室

    java+jdbc+mysql+socket搭建局域網(wǎng)聊天室

    這篇文章主要為大家詳細介紹了java+jdbc+mysql+socket搭建局域網(wǎng)聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java中Arrays.asList()需要注意的坑

    Java中Arrays.asList()需要注意的坑

    在Java中,我們經(jīng)常需要將數(shù)組轉(zhuǎn)換為List來方便地進行操作,Arrays.asList()方法是一種常見的方式,本文主要介紹了Java中Arrays.asList()需要注意的坑,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • IDEA加載項目沒有src目錄的問題及解決

    IDEA加載項目沒有src目錄的問題及解決

    這篇文章主要介紹了IDEA加載項目沒有src目錄的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java求s=a+aa+aaa+aaaa+aa...a 5個數(shù)相加的值

    Java求s=a+aa+aaa+aaaa+aa...a 5個數(shù)相加的值

    求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數(shù)字。例如2+22+222+2222+22222(此時共有5個數(shù)相加),幾個數(shù)相加有鍵盤控制
    2017-02-02
  • springboot CompletableFuture異步線程池詳解

    springboot CompletableFuture異步線程池詳解

    這篇文章主要介紹了springboot CompletableFuture異步線程池的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Tomcat調(diào)優(yōu)詳解

    Tomcat調(diào)優(yōu)詳解

    這篇文章主要介紹了Tomcat調(diào)優(yōu)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論