路由過濾器允許用某種方式修改HTTP請求或響應。路由過濾器作用于一些特殊的路由。Spring Cloud Gateway包含了許多構(gòu)建GatewayFilter的工廠。
注意:有關如何使用以下任何過濾器的更詳細示例,請查看?unit tests。
AddRequestHeader GatewayFilter Factory
AddRequestHeader GatewayFilter Factory 包括名稱和值參數(shù)。

將所有匹配的請求,添加X-Request-Foo:Bar頭信息。
AddRequestParameter GatewayFilter Factory
AddRequestParameter GatewayFilter Factory 包括名稱和值參數(shù)。

將所有匹配的請求,添加?foo=bar參數(shù)信息。
AddResponseHeader GatewayFilter Factory
AddResponseHeader GatewayFilter Factory 包括名稱和值參數(shù)。

將所有匹配的請求,返回頭信息中添加X-Response-Foo:Bar信息。
DedupeResponseHeader GatewayFilter Factory
DedupeResponseHeader GatewayFilter Factory?采用名稱參數(shù)和可選策略參數(shù)。名稱可以包含頭名稱列表,以空格分隔。

這將刪除訪問Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin響應頭的重復值,以防網(wǎng)關CORS邏輯和下游添加它們。
DedupeResponseHeader過濾器也可接收可選策略參數(shù),可接收參數(shù)值包括:RETAIN_FIRST?(default),?RETAIN_LAST, and?RETAIN_UNIQUE。
說明:
? ? ? ? 1.該過濾器兩個參數(shù)。第一個是去重敏感頭信息,多個頭信息之間以空格間隔;第二個是保留策略,默認是保留第一個。多個參數(shù)之間用逗號隔開;
? ? ? ? ? 2.釋義:參考上例。如果Access-Control-Allow-Credentials頭中包含有多個值,那么通過可選策略進行保留。RETAIN_FIRST 保留第一個值(默認),RETAIN_LAST保留最后一個值,RETAIN_UNIQUE全部保留。Access-Control-Allow-Origin也是一樣的。
Hystrix是一個來自Netflix的庫,且實現(xiàn)了斷路器模式(?circuit breaker pattern)。?
Hystrix GatewayFilter允許您向網(wǎng)關路由引入斷路器,保護您的服務不受級聯(lián)故障的影響,并允許您在下游故障時提供回退響應。
Hystrix GatewayFilters引入,需要添加依賴spring-cloud-starter-netflix-hystrix來源于?Spring Cloud Netflix。
Hystrix GatewayFilter Factory 需要一個name參數(shù),即HystrixCommand的名稱。

其余的過濾器被包裝在名稱為myCommandName的HystrixCommand中。
Hystrix 過濾器也可接收一個可選的fallbackUri參數(shù)。目前,只支持forward: 預設URI。如果fallback被觸發(fā),請求將轉(zhuǎn)發(fā)到URI匹配的控制層。

以上示例,當Hystrix fallback被觸發(fā)時,該訪問將被轉(zhuǎn)發(fā)到/incaseoffailureusethis地址。注意這個例子也演示了Spring Cloud Netflix Ribbon負載均衡,通過lb前綴指向目標URI,當然這是可選的。
這里主要場景是使用fallbackUri指向一個在網(wǎng)關應用內(nèi)部的controller或handler。也可能重新路由請求到controller或handler指向外部應用,例如:

在這個示例中,在網(wǎng)關應用中并沒有fallback的endpoint?或handler,然而,他卻在另一個應用中,注冊在http://localhost:9994上。
如果請求被轉(zhuǎn)發(fā)到fallback,Hystrix Gateway過濾器也提供了Throwable。它被添加在ServerWebExchange中,作為ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR的屬性,在網(wǎng)關應用中執(zhí)行fallback的時候可以使用。
如果是外部的controller/handler 應用場景,頭能被添加異常詳情。你可以找到更多信息在這里FallbackHeaders GatewayFilter Factory section。
Hystrix設置(如超時)可以使用全局默認值進行配置,也可以使用Hystrix wiki中介紹的應用程序?qū)傩园绰酚蛇M行配置。
設置5秒超時,觸發(fā)熔斷,你可以用如下方式設置:

FallbackHeaders GatewayFilter Factory
FallbackHeaders?factory允許您在轉(zhuǎn)發(fā)到外部應用程序中的fallbackUri的請求的頭中添加Hystrix執(zhí)行異常詳細信息,如下所示:

在此示例中,在運行HystrixCommand時發(fā)生執(zhí)行異常后,請求將轉(zhuǎn)發(fā)到localhost:9994上運行的應用程序中的fallback?endpoint或handler。 具有異常類型,消息和-if available- root的頭會導致異常類型和消息由FallbackHeaders過濾器添加到該請求中。
通過設置下面列出的參數(shù)的值及其默認值,可以在配置中覆蓋頭的名稱:
executionExceptionTypeHeaderName?("Execution-Exception-Type")
executionExceptionMessageHeaderName?("Execution-Exception-Message")
rootCauseExceptionTypeHeaderName?("Root-Cause-Exception-Type")
rootCauseExceptionMessageHeaderName?("Root-Cause-Exception-Message")
您可以在中找到有關Hystrix如何與Gateway配合使用的更多信息?Hystrix GatewayFilter Factory section。
PrefixPath GatewayFilter Factory
PrefixPath GatewayFilter Factory 只有一個前綴參數(shù)。

/mypath前綴將匹配所有的請求,例如請求? /hello,將發(fā)送到后臺為 /mypath/hello。
備注:如果設置了多個,第一個生效。
PreserveHostHeader GatewayFilter Factory
PreserveHostHeader GatewayFilter Factory無參數(shù)。設置此屬性后,發(fā)送原始Host頭,而不是http客戶端確定的Host頭。

備注:當客服端通過Gateway訪問服務時,服務中獲取到Host頭。如果經(jīng)過此過濾器,則服務端獲取到的是客戶端請求網(wǎng)關的Host;如果未經(jīng)過此過濾器,則服務端獲取到的是網(wǎng)關請求服務端的Host。
RequestRateLimiter GatewayFilter Factory
RequestRateLimiter GatewayFilter Factory?使用RateLimiter實現(xiàn)來確定是否允許繼續(xù)執(zhí)行當前請求。如果不通過,返回HTTP狀態(tài)值429。太多請求時(默認)被返回。
這個過濾器接受一個可選的keysolver參數(shù)和特定于速率限制器的參數(shù)(見下文)。
keyResolver 是個實現(xiàn)了KeyResolver接口的bean。 在配置中,bean使用SpEL表達式:#{@myKeyResolver} ,其中myKeyResolver為bean的名稱。

KeyResolver 接口允許插件策略派生key來做請求限流。在未來,將實現(xiàn)一些KeyResolver。
KeyResolver的默認實現(xiàn)是PrincipalNameKeyResolver,它從ServerWebExchange檢索主體并調(diào)用Principal.GetName()。
默認情況下,如果KeyResolver沒有找到key值,請求將被拒絕。此行為將通過如下屬性調(diào)節(jié):
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key?(true or false)?
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code
RequestRateLimiter不可以通過?"shortcut" 符號配置,以下為錯誤示例:

redis實現(xiàn)基于Stripe完成的工作。 它需要使用spring-boot-starter-data-redis -active Spring Boot starter。
算法使用的是令牌桶算法?Token Bucket Algorithm.
redis-rate-limiter.replenishRate是您希望允許用戶每秒執(zhí)行多少請求,而不會丟棄任何請求。 這是令牌桶填充的速率。
redis-rate-limiter.burstCapacity是用戶在一秒鐘內(nèi)允許執(zhí)行的最大請求數(shù)。 這是令牌桶可以容納的令牌數(shù)。 將此值設置為零將阻止所有請求。
通過在replenishRate和burstCapacity中設置相同的值來實現(xiàn)穩(wěn)定的速率。通過將burstCapacity設置為高于replenishRate,可以允許臨時突發(fā)流量。在這種情況下,需要在兩次突發(fā)之間允許速率限制器留出一段時間(根據(jù)replenishRate),因為連續(xù)2次突發(fā)將導致請求被丟棄(HTTP 429 - Too Many Requests)。


這定義了每個用戶10的請求率限制。 允許突發(fā)20,但下一秒只有10個請求可用。 KeyResolver是一個簡單的獲取用戶請求參數(shù)(注意:這不建議用于生產(chǎn))。
限速器也可以定義為實現(xiàn)RateLimiter接口的bean。 在配置中,使用SpEL按名稱引用bean。 #{@ myRateLimiter}是一個引用名為myRateLimiter的bean的SpEL表達式。

RedirectTo GatewayFilter Factory
RedirectTo GatewayFilter Factory 包含狀態(tài)參數(shù)和地址參數(shù)。 狀態(tài)參數(shù)必須是300系列的重定向http狀態(tài)碼,例如301。地址必須有效,這將是Location頭的值。

這將發(fā)送狀態(tài)302和Location:https://acme.org頭以執(zhí)行重定向。
說明:服務端返回302后,重定向到https://acme.org地址。
RemoveHopByHopHeadersFilter GatewayFilter Factory
RemoveHopByHopHeadersFilter GatewayFilter Factory從轉(zhuǎn)發(fā)的請求中刪除頭。 刪除的頭列表來自IETF。
默認刪除的頭包括:
Connection
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
TE
Trailer
Transfer-Encoding
Upgrade
要更改此設置,請將spring.cloud.gateway.filter.remove-non-proxy-headers.headers屬性設置為要刪除的頭名稱列表(其作用于request及response)。
RemoveRequestHeader GatewayFilter Factory
RemoveRequestHeader GatewayFilter Factory 包含一個name參數(shù)。該name頭屬性將被移除。

X-Request-Foo名稱的頭信息在被下游接收前被移除。
說明:移除多個頭信息時按照如果方式寫,刪除請求頭中test1、test2。

RemoveResponseHeader GatewayFilter Factory
RemoveResponseHeader GatewayFilter Factory包含一個name參數(shù)。該name頭屬性將被刪除。

X-Response-Foo名稱的頭信息在下游返回對象中移除,最終網(wǎng)關客戶端不能看到。
要刪除任何類型的敏感頭,你應該配置這些過濾器在你想加的路由中,也可以使用spring.cloud.gateway.default-filters配置此過濾器,并將其應用于所有路由。
說明:移除多個頭信息時按照如果方式寫,刪除響應頭中test1、test2。

RewritePath GatewayFilter Factory
RewritePath GatewayFilter Factory包括路徑(正則表達式)參數(shù)和替換參數(shù)。這使用Java正則表達式來靈活地重寫請求路徑。

對于/foo/bar的請求路徑,這將在發(fā)出下游請求之前將路徑設置為/bar。注意由于YAML規(guī)范,$\替換為$。
說明:1.重寫路徑共兩個參數(shù),regexp和replacement,其中regexp可以是正則表達式。將請求路徑中包含regexp的內(nèi)容,全部替換為replacement;
? ? ? ? ? 2.在上例中,如果"$"后面不帶"\",yaml文件中就會識別為獲取segment變量;
? ? ? ? ? 3.可以寫多個RewritePath 過濾器,通常是按照順序執(zhí)行。第二次替換的請求路徑是基于第一次加工的結(jié)果。
RewriteResponseHeader GatewayFilter Factory
RewriteResponseHeader GatewayFilter Factory包括名稱,正則表達式和替換參數(shù)。這使用Java正則表達式來靈活地重寫返回頭值。

對于頭信息中值為 /42?user=ford&password=omg!what&flag=true, 將被設置為 /42?user=ford&password=***&flag=true .。注意由于YAML規(guī)范,$\替換為$。
備注:上例中是三個參數(shù),第一個是頭信息中的參數(shù)名稱;第二個是正則表達式,第三個是字符串。通過第一個參數(shù)獲取頭信息值,將值中匹配第二個參數(shù)的內(nèi)容,替換成第三個參數(shù)。
SaveSession GatewayFilter Factory
SaveSession GatewayFilter Factory在轉(zhuǎn)發(fā)下游調(diào)用之前強制執(zhí)行WebSession :: save操作。 當使用Spring Session與惰性數(shù)據(jù)存儲之類的東西時,這是特別有用的,并且需要確保在轉(zhuǎn)發(fā)調(diào)用之前已保存會話狀態(tài)。

如果要將Spring Security與Spring Session集成,并且希望確保將安全性詳細信息轉(zhuǎn)發(fā)到遠程進程,則這很關鍵。
說明:session存在內(nèi)存中,那如果多個節(jié)點的時候,該如何處理?
? ? ? ? ? 1.可以通過網(wǎng)關前端的hash路由等策略來實現(xiàn),用戶被分配到固定的機器上;
? ? ? ? ?2.對于多節(jié)點session同步,可以通過第三方存儲來實現(xiàn),例如redis等。
SecureHeaders GatewayFilter Factory
SecureHeaders GatewayFilter Factory在響應時添加一些在此博文中推薦的頭信息。
添加以下標頭(以及默認值):
X-Xss-Protection:1; mode=block
Strict-Transport-Security:max-age=631138519
X-Frame-Options:DENY
X-Content-Type-Options:nosniff
Referrer-Policy:no-referrer
Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
X-Download-Options:noopen
X-Permitted-Cross-Domain-Policies:none
要更改默認值,請在spring.cloud.gateway.filter.secure-headers命名空間中設置相應的屬性:
可改變的屬性如下:
xss-protection-header
strict-transport-security
frame-options
content-type-options
referrer-policy
content-security-policy
download-options
permitted-cross-domain-policies
要禁用默認值,請使用逗號分隔值設置屬性spring.cloud.gateway.filter.secure-headers.disable。
例如:
spring.cloud.gateway.filter.secure-headers.disable=frame-options,download-options
說明:此過濾器是安全增強過濾器,可以為用戶方便提供一些安全屬性。當然,也可以通過配置屬性,去掉其中一部分安全屬性。
SetPath GatewayFilter Factory 包含一個路徑模板參數(shù)。它提供了一種通過允許模板化路徑段來操作請求路徑的簡單方法。這使用了Spring Framework中的uri模板。允許多個匹配的段。

以上示例,請求?/foo/bar,在向下游請求前,此路徑修改為/bar。
備注:SetPath 與RewritePath 都用來修改請求路徑的過濾器,但它們使用不同方式:
? ? ? ? ? ?1. SetPath 設置路徑,將原有路徑覆蓋;或者通過變量模板的方式,截取部分路徑;
? ? ? ? ? ?2. RewritePath? 將訪問路徑中,符合正則表達式內(nèi)容,替換為目標內(nèi)容。
SetResponseHeader GatewayFilter Factory
SetResponseHeader GatewayFilter Factory 包含名稱和值參數(shù)。

此GatewayFilter用給定名稱替換所有標頭,而不是添加。因此,如果下游服務器使用X-Response-Foo:1234進行響應,則會將其替換為X-Response-Foo:Bar,這是網(wǎng)關客戶端將收到的內(nèi)容。
SetStatus GatewayFilter Factory
SetStatus GatewayFilter Factory采用單個狀態(tài)參數(shù)。 它必須是有效的Spring HttpStatus。 它可以是整數(shù)值404或枚舉NOT_FOUND的字符串表示形式。

在以上情況,響應的HTTP狀態(tài)都將設置為400(BAD_RQUEST)或者401。
備注:如果過濾器中配置了多個SetStatus,默認返回第一個狀態(tài)碼。
StripPrefix GatewayFilter Factory
StripPrefix GatewayFilter Factory 只有一個 parts參數(shù)。parts參數(shù)指示在向下游發(fā)送之前從請求中剝離的路徑中的部分數(shù)。

當通過網(wǎng)關向/name/bar/foo發(fā)出請求時,對nameservice的請求將看起來像https://nameservice/foo。
Retry GatewayFilter Factory包括?retries,?statuses,?methods, 和series作為參數(shù)。
retries: 嘗試的重發(fā)次數(shù);
statuses: 要重試的HTTP狀態(tài)碼,使用org.springframework.http.HttpStatus表示;
methods: 要重試的HTTP請求方法, 使用org.springframework.http.HttpMethod表示;
series:?要重試的一系列狀態(tài)碼(理解該狀態(tài)對應HTTP多個狀態(tài)碼),使用org.springframework.http.HttpStatus.Series表示。

重試過濾器當前不支持使用body請求的重試(例如,對于具有body的POST或PUT請求)。
當使用帶有forward:?prefixed URL的重試過濾器時,應仔細編寫目標端點,以便在出現(xiàn)錯誤時不會執(zhí)行任何可能導致響應發(fā)送到客戶端并提交的操作。例如:如果目標端是一個注解控制器,該控制器的方法不應該返回帶有錯誤狀態(tài)碼的ResponseEntity對象,應該拋出異常或者發(fā)出錯誤信號,例如通過?Mono.error(ex) 返回值。這樣重試過濾器才進行重試。
說明:series、statuses、methods參數(shù)可以是多個,且以逗號隔開。
RequestSize GatewayFilter Factory
當請求大小大于允許的限制時,RequestSize GatewayFilter Factory可以限制請求到達下游服務。過濾器將RequestSize作為參數(shù),該參數(shù)是以字節(jié)為單位定義的請求的允許大小限制。

RequestSize GatewayFilter Factory將響應狀態(tài)設置為413,當負載太大時,并在請求因大小而被拒絕時添加標頭errorMessage。示例說明:
? ? ?errorMessage?:?請求大小大于允許的限制。 請求大小為6 MB,允許的限制為5 MB。
如果未在路由定義中提供過濾器參數(shù),則默認請求大小將設置為5 MB。
Modify Request Body GatewayFilter Factory
此過濾器被視為BETA,API可能在將來發(fā)生變化
此過濾器可以修改請求body內(nèi)容,通過網(wǎng)關被發(fā)送到下游前進行。
此過濾只能使用Java DSL進行配置,不支持YAML配置。?

Modify Response Body GatewayFilter Factory
此過濾器被視為BETA,API可能在將來發(fā)生變化
此過濾器被用在修改返回body內(nèi)容,在發(fā)送給客戶前。
此過濾只能使用Java DSL進行配置,不支持YAML配置。

如果您想添加過濾器并將其應用于所有路由,可以使用spring.cloud.gateway.default-filters。 此屬性采用過濾器列表。
