原创 尹吉欢 猿天地 2018-09-25 今天我们来学习下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

讨论时间 文章中讲的这几个工厂类的作用我们已经了解了,那具体的使用场景有哪些?适合在什么场景下使用呢?欢迎大家留言讨论。

猿天地

尹吉欢 我不差钱啊 喜欢作者