當前位置: 妍妍網 > 碼農

今日程式碼大賞 | Spring Cloud Gateway 全域過濾器實作

2024-05-11碼農

在構建微服務架構時,Spring Cloud Gateway 作為服務閘道器,承擔著路由轉發、許可權校驗等職責。

全域過濾器(Global Filter)是 Spring Cloud Gateway 中用於處理跨服務的通用邏輯的元件,例如許可權驗證、日誌記錄等。

下面是Spring Cloud Gateway中實作全域過濾器的範例程式碼:

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
@Component
public classGlobalAuthFilterimplementsGlobalFilter, Ordered {
privateAntPathMatcherantPathMatcher = newAntPathMatcher();
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequestserverHttpRequest = exchange.getRequest();
Stringpath = serverHttpRequest.getURI().getPath();
// 判斷路徑中是否包含 "inner",只允許內部呼叫
if (antPathMatcher.match("/**/inner/**", path)) {
ServerHttpResponseresponse = exchange.getResponse();
response.setStatusCode(HttpStatus.FORBIDDEN);
DataBufferFactorydataBufferFactory = response.bufferFactory();
DataBufferdataBuffer = dataBufferFactory.wrap("無許可權".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(dataBuffer));
}
// 統一許可權校驗,此處應添加JWT等驗證邏輯
// todo 統一許可權校驗,透過 JWT 獲取登入使用者資訊
return chain.filter(exchange);
}
/**
* 設定過濾器的優先級
* 值越小,優先級越高
@return
*/

@Override
publicintgetOrder() {
return0;
}
}




全域過濾器的優點

  • 統一處理 :可以在一個地方集中處理所有請求的預處理和後處理邏輯。

  • 順序可控 :透過實作 Ordered 介面,可以控制過濾器的執行順序。

  • 今天的程式碼大賞就到這裏。希望透過這篇文章,你能夠對 Spring Cloud Gateway 全域過濾器 實作有一個更深入的理解。

    完整程式碼片段 來源於程式碼小抄,歡迎點選進入小程式閱讀!

    線上存取:https://www.codecopy.cn/post/kt2g78

    在程式碼小抄可以看到更多優質程式碼,也歡迎大家積極分享,可能會獲得我們官方的小禮品 🎁~

    往期推薦