今天我们来学习下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...
英文不好,就随意翻译下,大概的意思如下:
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,这几个就不做单独讲解了,使用方式是一样的。一个是添加请求参数,一个是添加响应的请求头。
filters: - AddRequestParameter=name, yinjihuan
filters: - AddResponseHeader=name, yinjihuan
文章中讲的这几个工厂类的作用我们已经了解了,那具体的使用场景有哪些?适合在什么场景下使用呢?欢迎大家留言讨论。