Spring項(xiàng)目中Ordered接口的應(yīng)用之全局過濾器(GlobalFilter)的順序控制
在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux項(xiàng)目中,Ordered接口扮演著重要的角色,特別是在實(shí)現(xiàn)全局過濾器(GlobalFilter)時(shí),用于控制過濾器執(zhí)行的優(yōu)先級(jí)。下面將介紹如何在Spring項(xiàng)目中使用Ordered接口來管理Global Filter的執(zhí)行順序。
Ordered接口簡介
Ordered接口位于org.springframework.core包下,定義了單一方法getOrder(),用于返回一個(gè)整數(shù)值來表明組件的排序優(yōu)先級(jí)。該接口有兩個(gè)靜態(tài)常量:
HIGHEST_PRECEDENCE:設(shè)置最高優(yōu)先級(jí),值為Integer.MIN_VALUE。LOWEST_PRECEDENCE:設(shè)置最低優(yōu)先級(jí),值為Integer.MAX_VALUE。
全局過濾器(GlobalFilter)與Ordered
GlobalFilter介紹
在Spring Cloud Gateway或WebFlux應(yīng)用中,GlobalFilter是一種可以對所有進(jìn)入網(wǎng)關(guān)的請求或從網(wǎng)關(guān)出去的響應(yīng)進(jìn)行攔截處理的機(jī)制。它們允許開發(fā)者實(shí)現(xiàn)跨切割點(diǎn)的邏輯,如鑒權(quán)、日志記錄、請求改寫等。
控制執(zhí)行順序
為了確保過濾器按照預(yù)期的順序執(zhí)行,實(shí)現(xiàn)Ordered接口變得尤為重要。不同的過濾器可能依賴于其他過濾器的操作結(jié)果,或者有特定的執(zhí)行要求,通過實(shí)現(xiàn)getOrder()方法返回不同的優(yōu)先級(jí)值,可以精確控制過濾器鏈中的執(zhí)行順序。
實(shí)現(xiàn)示例
假設(shè)我們要?jiǎng)?chuàng)建一個(gè)簡單的日志記錄過濾器和一個(gè)鑒權(quán)過濾器,并且希望鑒權(quán)操作發(fā)生在日志記錄之前,我們可以這樣做:
// 導(dǎo)入必要的包
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<Object> implements Ordered {
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
// 在此處實(shí)現(xiàn)日志記錄邏輯
System.out.println("Logging before request...");
return chain.filter(exchange).then(Mono.fromRunnable(() ->
System.out.println("Logging after response...")));
};
}
@Override
public int getOrder() {
// 設(shè)置此過濾器的執(zhí)行優(yōu)先級(jí),數(shù)值越大,執(zhí)行越晚
return -10;
}
}
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在此處實(shí)現(xiàn)鑒權(quán)邏輯
System.out.println("Authenticating request...");
// 假設(shè)鑒權(quán)通過,繼續(xù)處理請求
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 設(shè)置此過濾器的執(zhí)行優(yōu)先級(jí),數(shù)值越小,執(zhí)行越早
return -20;
}
}說明
LoggingFilter實(shí)現(xiàn)了日志記錄功能,并通過getOrder()方法設(shè)置了較低的優(yōu)先級(jí),意味著它將在大多數(shù)其他過濾器之后執(zhí)行。AuthFilter負(fù)責(zé)鑒權(quán)邏輯,通過實(shí)現(xiàn)Ordered接口并返回較高的優(yōu)先級(jí)值,確保其在日志記錄之前執(zhí)行。
通過這種方式,開發(fā)者可以精確地控制不同Global Filter的執(zhí)行順序,以滿足應(yīng)用的具體需求。
到此這篇關(guān)于Spring項(xiàng)目中Ordered接口的應(yīng)用之全局過濾器(GlobalFilter)的順序控制的文章就介紹到這了,更多相關(guān)Spring Ordered接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot讀取bootstrap配置及knife4j版本兼容性問題及解決
這篇文章主要介紹了springboot讀取bootstrap配置及knife4j版本兼容性問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
java中以DES的方式實(shí)現(xiàn)對稱加密并提供密鑰的實(shí)例
這篇文章主要介紹了java中以DES的方式實(shí)現(xiàn)對稱加密并提供密鑰的實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2017-08-08
Java項(xiàng)目中Service 層不直接返回Result 對象的原因分析
在Service層直接返回Result對象會(huì)導(dǎo)致業(yè)務(wù)邏輯與表現(xiàn)邏輯耦合,降低代碼清晰度和可維護(hù)性,正確的做法是讓每一層專注于自己的職責(zé),保持代碼可復(fù)用性,這篇文章給大家介紹為什么Java里面,Service 層不直接返回Result對象,感興趣的朋友跟隨小編一起看看吧2026-02-02
Java實(shí)現(xiàn)單例設(shè)計(jì)模式方法解析
這篇文章主要介紹了Java實(shí)現(xiàn)單例設(shè)計(jì)模式方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java基礎(chǔ)知識(shí)精通循環(huán)結(jié)構(gòu)與break及continue
循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來控制程序的流程2022-04-04
SpringBoot讀取配置文件的6種實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot讀取配置文件的6種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

