Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory


今天我們來學習下GatewayFilter Factory,中文解釋就是過濾器工廠。

官方文檔對GatewayFilter Factory的介紹:

Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular route. Spring Cloud Gateway includes many built-in GatewayFilter Factories.

文檔地址:http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html#_gatewayfilter_factories

英文不好,就隨意翻譯下,大概的意思如下:

Spring Cloud Gateway的路由過濾器允許以某種方式修改傳入的HTTP請求或輸出的HTTP響應。只作用於特定的路由。Spring Cloud Gateway中內置了很多的過濾器工廠。

通過目前的文檔,我看到了內置的數量為20個,今天我們來學習第一個過濾器工廠AddRequestHeader GatewayFilter Factory。

通過名稱我們可以快速的明白這個過濾器工廠的作用,就是添加請求頭。

使用示列:

spring:
  cloud:
    gateway:
      routes:
      - id: fsh-house
        uri: lb://fsh-house
        predicates:
        - Path=/house/**
        filters:
        - AddRequestHeader=NAME, yinjihuan

上面的配置,我們針對fsh-house這個服務的路由配置了AddRequestHeader,增加了一個名稱為NAME,值是yinjihuan的請求頭。

這樣配置之后,在fsh-house服務中的所有接口,都可以通過request來獲取到NAME請求頭的信息,代碼如下:

@GetMapping("/hello")
public String hello(HttpServletRequest request) throws  Exception {
	System.err.println(request.getHeader("NAME"));
	return "Hello"+serverPort;
}

如果我們需要傳遞多個請求頭咋配置?

 filters:
        - AddRequestHeader=NAME, yinjihuan
        - AddRequestHeader=NAME2, yinjihuan2

配置2個過濾器就行了,是不支持一個過濾器配置多個請求頭的方式,原因我們通過源碼可以得出,請看源碼:

public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {

	@Override
	public GatewayFilter apply(NameValueConfig config) {
		return (exchange, chain) -> {
			ServerHttpRequest request = exchange.getRequest().mutate()
					.header(config.getName(), config.getValue())
					.build();

			return chain.filter(exchange.mutate().request(request).build());
		};
    }

}

NameValueConfig就2個字段,一個name,一個value,對應的也就是請求頭的名稱和值。

類似的工廠類還有AddRequestParameter和AddResponseHeader,RemoveRequestHeader,RemoveResponseHeader,這幾個就不做單獨講解了,使用方式是一樣的。一個是添加請求參數,一個是添加響應的請求頭。

AddRequestParameter配置示列:

 filters:
        - AddRequestParameter=name, yinjihuan

AddResponseHeader配置示列:

 filters:
        - AddResponseHeader=name, yinjihuan

討論時間

文章中講的這幾個工廠類的作用我們已經了解了,那具體的使用場景有哪些?適合在什么場景下使用呢?歡迎大家留言討論。

歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course)

微信掃碼加入猿天地知識星球

猿天地


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM