天天看點

gateway中的局部過濾器_GateWay過濾器

Spring Cloud Gateway除了具備請求路由功能之外,也支援對請求的過濾。通過Zuul網關類似,也是通

過過濾器的形式來實作的。那麼接下來我們一起來研究一下Gateway中的過濾器

3.3.1 過濾器基礎

(1) 過濾器的生命周期

Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那麼豐富,它隻有兩個:“pre” 和 “post”。

PRE : 這種過濾器在請求被路由之前調用。我們可利用這種過濾器實作身份驗證、在叢集中選擇

請求的微服務、記錄調試資訊等。

POST :這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應添加标準的 HTTP

Header、收集統計資訊和名額、将響應從微服務發送給用戶端等。

gateway中的局部過濾器_GateWay過濾器

( 2) 過濾器類型

Spring Cloud Gateway 的 Filter 從作用範圍可分為另外兩種GatewayFilter 與 GlobalFilter。

GatewayFilter :應用到單個路由或者一個分組的路由上。

GlobalFilter :應用到所有的路由上。

3.3.2 局部過濾器

局部過濾器(GatewayFilter),是針對單個路由的過濾器。可以對通路的URL過濾,進行切面處理。在

Spring Cloud Gateway中通過GatewayFilter的形式内置了很多不同類型的局部過濾器。這裡簡單将

Spring Cloud Gateway内置的所有過濾器工廠整理成了一張表格,雖然不是很詳細,但能作為速覽使

用。如下:

gateway中的局部過濾器_GateWay過濾器
gateway中的局部過濾器_GateWay過濾器

每個過濾器工廠都對應一個實作類,并且這些類的名稱必須以 GatewayFilterFactory 結尾,這是

Spring Cloud Gateway的一個約定,例如 AddRequestHeader 對應的實作類為

AddRequestHeaderGatewayFilterFactory 。對于這些過濾器的使用方式可以參考官方文檔

3.3.3 全局過濾器

全局過濾器(GlobalFilter)作用于所有路由,Spring Cloud Gateway 定義了Global Filter接口,使用者

可以自定義實作自己的Global Filter。通過全局過濾器可以實作對權限的統一校驗,安全性驗證等功

能,并且全局過濾器也是程式員使用比較多的過濾器。

Spring Cloud Gateway内部也是通過一系列的内置全局過濾器對整個路由轉發進行處理如下:

gateway中的局部過濾器_GateWay過濾器

3.4 統一鑒權

内置的過濾器已經可以完成大部分的功能,但是對于企業開發的一些業務功能處理,還是需要我們自己

編寫過濾器來實作的,那麼我們一起通過代碼的形式自定義一個過濾器,去完成統一的權限校驗。

3.4.1 鑒權邏輯

開發中的鑒權邏輯:

當用戶端第一次請求服務時,服務端對使用者進行資訊認證(登入)

認證通過,将使用者資訊進行加密形成 token,傳回給用戶端,作為登入憑證

以後每次請求,用戶端都攜帶認證的 token

服務端對 token進行解密,判斷是否有效。

gateway中的局部過濾器_GateWay過濾器

如上圖,對于驗證使用者是否已經登入鑒權的過程可以在網關層統一檢驗。檢驗的标準就是請求中是否攜

帶token憑證以及token的正确性。

3.4.2 代碼實作

下面的我們自定義一個GlobalFilter,去校驗所有請求的請求參數中是否包含“token”,如何不包含請求

參數“token”則不轉發路由,否則執行正常的邏輯。

@Componentpublic class LoginFilter implementsGlobalFilter,Ordered {@Overridepublic Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) {

System.out.println("執行了自定義的全局過濾器");//1.擷取請求參數access-token

String token = exchange.getRequest().getQueryParams().getFirst("access-token");//2.判斷是否存在

if(token == null) {//3.如果不存在 : 認證失敗

System.out.println("沒有登入");

exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete(); //請求結束

}//4.如果存在,繼續執行

return chain.filter(exchange); //繼續向下執行

}@Overridepublic intgetOrder() {return 0;

}

}

gateway中的局部過濾器_GateWay過濾器
gateway中的局部過濾器_GateWay過濾器