在前文中,咱們介紹了Spring Cloud Gateway內置了一系列的內置過濾器工廠,若Spring Cloud Gateway內置的過濾器工廠沒法知足咱們的業務需求,那麼此時就須要自定義本身的過濾器工廠以實現特定功能。所謂過濾器工廠實際上就是用於建立過濾器實例的,而建立的過濾器實例都實現於GatewayFilter接口。react
Gateway以轉發請求爲邊界,分爲兩個生命週期web
- pre:Gateway轉發請求以前
- post:Gateway轉發請求以後
可參考源碼:org.springframework.cloud.gateway.filter.factory.RequestSizeGatewayFilterFactoryspring
配置形式以下:api
spring: cloud: gateway: routes: filters: # 過濾器工廠的名稱 - name: RequestSize # 該過濾器工廠的參數 args: maxSize: 500000
可參考源碼:org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactoryapp
配置形式以下:ide
spring: cloud: gateway: routes: filters: # 過濾器工廠的名稱及參數以name-value的形式配置 - AddRequestHeader=S-Header, Bar
PS:AbstractNameValueGatewayFilterFactory繼承了AbstractGatewayFilterFactory,因此實際上第二種方式是第一種方式的簡化post
- exchange.getRequest().mutate().xxx:修改request
exchange.mutate().xxx:修改exchange
chain.filter(exchange):傳遞給下一個過濾器處理
*exchange.getResponse():獲取響應對象
PS::exchange實際類型爲ServerWebExchange,chain實際類型爲GatewayFilter測試
需求:記錄訪問日誌ui
import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; @Slf4j @Component public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { @Override public GatewayFilter apply(NameValueConfig config) { return (exchange, chain) -> { log.info("配置參數:{}, {}", config.getName(), config.getValue()); ServerHttpRequest request = exchange.getRequest() .mutate().build(); ServerWebExchange webExchange = exchange.mutate() .request(request) .build(); return chain.filter(webExchange); }; } }
spring: gateway: discovery: locator: enabled: false routes: - id: study uri: lb://study01 predicates: - TimeBetween=上午0:00,下午11:59 filters: # 名稱必須爲過濾器工廠類名的前綴,而且參數只能有兩個,由於NameValueConfig裏只定義了兩個屬性 - PreLog=testName,testValue
PS:日誌
2019-10-28 15:05:10.620 INFO 8734 --- [or-http-epoll-2] c.e.gateway.PreLogGatewayFilterFactory : 配置參數:testName, testValue