zoukankan      html  css  js  c++  java
  • 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)

    微信扫码加入猿天地知识星球

    猿天地

  • 相关阅读:
    云纵持续交付环境管理进化历程
    #研发解决方案#数据移山:接入、迁移、同步一站式
    如何快速判断一个人水平高低
    成长秘笈:是你教我,不是我教你
    年轻的工程师如何月入伍万XD
    Uber是如何重新思考GPS定位的(尤其是在城市峡谷中)
    当我们谈重构的时候我们想谈什么?
    #研发解决方案#异地多活让商户无感知
    乱是一种什么体验?
    新年技术团队寄语
  • 原文地址:https://www.cnblogs.com/yinjihuan/p/10481336.html
Copyright © 2011-2022 走看看