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

Spring Boot 3 中 WebFilter 的執(zhí)行順序流程分析

 更新時(shí)間:2025年08月09日 09:38:43   作者:牧云2800  
Spring Boot中管理WebFilter順序,默認(rèn)為Integer.MAX_VALUE,需顯式使用@Order或Ordered接口定義優(yōu)先級(jí),請求階段按順序值從小到大執(zhí)行,響應(yīng)階段按從大到小,相同順序值依賴Bean注冊順序,本文詳細(xì)說明在Spring Boot 3中如何管理這些過濾器的執(zhí)行流程,需要的朋友一起看看吧

理解并控制 WebFilter 的執(zhí)行順序?qū)τ跇?gòu)建可預(yù)測、行為正確的 Web 應(yīng)用至關(guān)重要。 本文詳細(xì)說明在 Spring Boot 3 中如何管理這些過濾器的執(zhí)行流程。

1. 默認(rèn)執(zhí)行順序

  • 核心規(guī)則: 當(dāng)開發(fā)者未顯式指定任何順序時(shí),所有 WebFilter 實(shí)例的默認(rèn)順序值被統(tǒng)一設(shè)置為 Ordered.LOWEST_PRECEDENCE(其數(shù)值等于 Integer.MAX_VALUE),這意味著它們默認(rèn)擁有最低的優(yōu)先級(jí),將在所有顯式指定了順序的過濾器之后執(zhí)行。
  • 默認(rèn)行為的影響: 在此默認(rèn)順序值下,多個(gè)過濾器的實(shí)際執(zhí)行順序由 Spring 容器中 Bean 的注冊順序 決定。這個(gè)順序可能受到諸如類路徑掃描(@ComponentScan)順序或 @Bean 配置方法在配置類中的聲明順序等因素的影響。這種行為本質(zhì)上是不可靠的,因?yàn)槲⑿〉拇a變動(dòng)或依賴更新都可能導(dǎo)致順序意外改變,不應(yīng)依賴于此進(jìn)行關(guān)鍵邏輯控制。

2. 顯式控制順序的方法

為了確保執(zhí)行順序的確定性和可預(yù)測性,Spring 提供了兩種主要機(jī)制來顯式定義 WebFilter 的優(yōu)先級(jí)。

2.1 使用@Order注解

通過在過濾器類上添加 @Order 注解并指定一個(gè)整數(shù)值,可以清晰定義其順序。值越小,表示優(yōu)先級(jí)越高,在請求處理階段越早執(zhí)行。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@Component
@Order(1) // 明確指定順序值為1(高優(yōu)先級(jí))
public class FilterA implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        System.out.println("FilterA (Order=1) - Before Logic"); // 在執(zhí)行業(yè)務(wù)邏輯前
        return chain.filter(exchange) // 將請求傳遞到鏈中的下一個(gè)過濾器或處理器
                   .then(Mono.fromRunnable(() -> 
                          System.out.println("FilterA (Order=1) - After Logic"))); // 在業(yè)務(wù)邏輯執(zhí)行后和響應(yīng)發(fā)送前
    }
}

2.2 實(shí)現(xiàn)Ordered接口

讓過濾器類實(shí)現(xiàn) Ordered 接口并重寫 getOrder() 方法是另一種等效且常用的方式。這種方式同樣遵循數(shù)值越小優(yōu)先級(jí)越高的原則。

import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@Component
public class FilterB implements WebFilter, Ordered { // 同時(shí)實(shí)現(xiàn)WebFilter和Ordered接口
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        System.out.println("FilterB (Order=2) - Before Logic");
        return chain.filter(exchange)
                   .then(Mono.fromRunnable(() -> 
                          System.out.println("FilterB (Order=2) - After Logic")));
    }
    @Override
    public int getOrder() { // 實(shí)現(xiàn)Ordered接口要求的方法,返回定義的順序值
        return 2; // 顯式定義順序值為2
    }
}

3. 執(zhí)行順序規(guī)則

Spring WebFlux 框架對 WebFilter 鏈的執(zhí)行遵循明確的規(guī)則,區(qū)分請求處理(正向)和響應(yīng)處理(反向)兩個(gè)階段:

  • 正向流程(請求處理階段):
    當(dāng)請求進(jìn)入時(shí),框架會(huì)按順序值 從小到大(即優(yōu)先級(jí)從高到低)依次調(diào)用每個(gè) WebFilterfilter 方法中的 chain.filter(exchange) 之前的代碼(即 “Before” 部分)。例如:@Order(1)@Order(2) → … → @Order(n)
  • 反向流程(響應(yīng)處理階段):
    當(dāng)業(yè)務(wù)邏輯處理完畢,開始構(gòu)建響應(yīng)并向上返回時(shí),框架會(huì)按順序值 從大到小(即優(yōu)先級(jí)從低到高)依次執(zhí)行每個(gè) WebFilterfilter 方法中 chain.filter(exchange).then(...) 里面的回調(diào)代碼(即 “After” 部分)。例如:@Order(n) → … → @Order(2)@Order(1)

3.1 示例輸出

結(jié)合 FilterA (Order=1) 和 FilterB (Order=2) 的代碼,執(zhí)行流程的日志輸出清晰地展示了上述規(guī)則:

FilterA (Order=1) - Before Logic  // 最高優(yōu)先級(jí)(1)最先處理請求
FilterB (Order=2) - Before Logic  // 次高優(yōu)先級(jí)(2)接著處理請求
... (執(zhí)行業(yè)務(wù)控制器邏輯) ...          // 實(shí)際業(yè)務(wù)處理
FilterB (Order=2) - After Logic   // 次高優(yōu)先級(jí)(2)最先處理響應(yīng)(反向)
FilterA (Order=1) - After Logic   // 最高優(yōu)先級(jí)(1)最后處理響應(yīng)(反向)

4. 特殊情況:相同順序值

  • 行為規(guī)則: 如果兩個(gè)或多個(gè) WebFilter 被顯式或隱式地賦予了相同的順序值(例如都使用 @Order(5) 或都未指定而使用默認(rèn)值 Integer.MAX_VALUE),則它們的執(zhí)行順序(包括正向和反向階段)將退回到由 Spring 容器中 Bean 的注冊順序 決定,這通常等同于類加載順序或 @Bean/@Component 的聲明或掃描順序。
  • 潛在風(fēng)險(xiǎn)與建議: 由于這種順序在特定環(huán)境下可能不穩(wěn)定,強(qiáng)烈建議開發(fā)者為所有需要特定執(zhí)行位置的過濾器顯式分配唯一且有意義的順序值,避免依賴默認(rèn)順序或沖突的順序值帶來的不確定性。

5. 總結(jié)

控制方式實(shí)現(xiàn)示例執(zhí)行順序規(guī)則
@Order 注解@Order(1) 標(biāo)注在 WebFilter 實(shí)現(xiàn)類上數(shù)值越小,在請求階段越早執(zhí)行
實(shí)現(xiàn) Ordered 接口getOrder() 方法返回具體數(shù)值 (如 2)數(shù)值越小,在請求階段越早執(zhí)行
未指定順序無注解或接口實(shí)現(xiàn),默認(rèn) Integer.MAX_VALUE最后執(zhí)行,具體順序不穩(wěn)定

最佳實(shí)踐推薦:

  1. 始終顯式指定順序: 對于任何有依賴關(guān)系或執(zhí)行位置要求的 WebFilter,務(wù)必使用 @Order 注解或?qū)崿F(xiàn) Ordered 接口來顯式定義其順序值(例如 @Order(100), @Order(200))。
  2. 規(guī)劃順序值范圍: 為不同類型的過濾器預(yù)留順序值區(qū)間(如認(rèn)證用 0-99,日志用 100-199,安全后處理用 200-299),提升可讀性和可維護(hù)性。
  3. 避免順序沖突: 確保關(guān)鍵過濾器的順序值唯一,防止因相同順序值導(dǎo)致的不確定行為。

遵循這些實(shí)踐能顯著增強(qiáng)過濾器行為的可預(yù)測性和應(yīng)用的健壯性。

到此這篇關(guān)于Spring Boot 3 中 WebFilter 的執(zhí)行順序流程分析的文章就介紹到這了,更多相關(guān)Spring Boot WebFilter 執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot項(xiàng)目使用Flyway的詳細(xì)教程

    Spring Boot項(xiàng)目使用Flyway的詳細(xì)教程

    這篇文章主要介紹了Spring Boot項(xiàng)目使用Flyway,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java中的static--靜態(tài)變量你了解嗎

    Java中的static--靜態(tài)變量你了解嗎

    Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員。它屬于整個(gè)類所有,而不是某個(gè)對象所有,即被類的所有對象所共享。靜態(tài)成員可以使用類名直接訪問,也可以使用對象名進(jìn)行訪問,.下面我們來詳細(xì)了解一下吧
    2021-09-09
  • SpringBoot實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的3種方法小結(jié)

    SpringBoot實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的3種方法小結(jié)

    為了提高系統(tǒng)的讀寫性能和可用性,讀寫分離是一種經(jīng)典的數(shù)據(jù)庫架構(gòu)模式,在SpringBoot應(yīng)用中,有多種方式可以實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,本文將介紹三種主實(shí)現(xiàn)方案,大家可以根據(jù)需要自行選擇
    2025-04-04
  • 關(guān)于jpa中無法刪除onetomany中many問題的解決

    關(guān)于jpa中無法刪除onetomany中many問題的解決

    這篇文章主要介紹了關(guān)于jpa中無法刪除onetomany中many問題的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java獲取最后插入MySQL記錄的自增ID值的3種方法

    Java獲取最后插入MySQL記錄的自增ID值的3種方法

    這篇文章介紹了Java獲取最后插入MySQL記錄的自增ID值的3種方法,有需要的朋友可以參考需要
    2013-08-08
  • SpringBoot實(shí)現(xiàn)敏感配置信息加密與解密

    SpringBoot實(shí)現(xiàn)敏感配置信息加密與解密

    SpringBoot支持多種配置加載方式,不管用哪種方式,敏感信息(比如數(shù)據(jù)庫密碼、Redis密碼、第三方API密鑰)如果明文存儲(chǔ),都會(huì)有泄露風(fēng)險(xiǎn),下面我們就來聊聊如何對敏感配置信息加密與解密吧
    2025-07-07
  • Java 通過API操作GraphQL

    Java 通過API操作GraphQL

    這篇文章主要介紹了Java 通過API操作GraphQL的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-05-05
  • SpringBoot應(yīng)用是否存在MySQL連接泄漏問題的排查方法

    SpringBoot應(yīng)用是否存在MySQL連接泄漏問題的排查方法

    這篇文章主要介紹了排查SpringBoot應(yīng)用MySQL連接泄漏的方法,需檢查連接數(shù)、空閑連接,配置連接池參數(shù),確保資源關(guān)閉,并使用監(jiān)控工具如Actuator和Prometheus分析,需要的朋友可以參考下
    2025-06-06
  • Java JVM中線程狀態(tài)詳解

    Java JVM中線程狀態(tài)詳解

    這篇文章主要介紹了Java JVM中線程狀態(tài)詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的朋友可以參考一下
    2022-09-09
  • java的四種常用輸入方法你會(huì)幾種

    java的四種常用輸入方法你會(huì)幾種

    這篇文章主要介紹了java四種常用輸入方法的相關(guān)資料,分別是Scanner、System、命令行和JOptionPane,每種方法都有其特點(diǎn)和適用場景,文中提供了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

老河口市| 长春市| 叙永县| 福海县| 仙游县| 轮台县| 五寨县| 金山区| 德安县| 阳信县| 铁力市| 子长县| 海阳市| 定西市| 上思县| 临汾市| 加查县| 哈尔滨市| 承德县| 潼南县| 牡丹江市| 呼图壁县| 商水县| 玛纳斯县| 巢湖市| 广西| 克东县| 贵阳市| 宁晋县| 务川| 朝阳市| 华宁县| 乐东| 阿克| 青岛市| 潜江市| 宁远县| 新田县| 新田县| 衡南县| 连州市|