Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory

3次阅读

共计 1850 个字符,预计需要花费 5 分钟才能阅读完成。

今天我们来学习下 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,这几个就不做单独讲解了,使用方式是一样的。一个是添加请求参数,一个是添加响应的请求头。
AddRequestParameter 配置示列:
filters:
– AddRequestParameter=name, yinjihuan
AddResponseHeader 配置示列:
filters:
– AddResponseHeader=name, yinjihuan
讨论时间
文章中讲的这几个工厂类的作用我们已经了解了,那具体的使用场景有哪些?适合在什么场景下使用呢?欢迎大家留言讨论。
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)

正文完
 0