1. 程式人生 > >Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory

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.

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

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

討論時間

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

猿天地