Skip to content

SetRequestHeader GatewayFilter 工厂

SetRequestHeader GatewayFilter 工厂接受 namevalue 两个参数。 以下示例配置了一个 SetRequestHeader GatewayFilter:

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: setrequestheader_route
        uri: https://example.org
        filters:
        - SetRequestHeader=X-Request-Red, Blue

此 GatewayFilter 会替换(而不是添加)所有具有给定名称的 Header。 因此,如果下游服务响应(这里原文可能有误,应指客户端请求或上游)原本包含 X-Request-Red:1234,通过该过滤器后,它将被替换为 X-Request-Red:Blue,这才是下游服务最终收到的值。

SetRequestHeader 能够感知用于匹配路径或主机的 URI 变量。 URI 变量可以在 value 中使用,并在运行时进行扩展(替换)。 以下示例配置了一个使用变量的 SetRequestHeader GatewayFilter:

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: setrequestheader_route
        uri: https://example.org
        predicates:
        - Host={segment}.myhost.org
        filters:
        - SetRequestHeader=foo, bar-{segment}

补充教学 —— Add 与 Set 的区别?

很多同学搞不清楚 AddRequestHeaderSetRequestHeader 的区别,因为它们看起来都是“给 Header 赋值”。

  • AddRequestHeader (追加模式)

    • 行为:如果 Header 已经存在,它不会覆盖,而是追加一个新的值。
    • 结果:Header 会变成一个列表
    • 例子
      • 原始请求:User-Id: 100
      • 配置:AddRequestHeader=User-Id, 200
      • 最终结果:User-Id: [100, 200](下游服务会收到两个值)
  • SetRequestHeader (覆盖/设置模式)

    • 行为:不管 Header 存不存在,直接清空旧值,设置新值
    • 结果:Header 永远只有你配置的那一个值
    • 例子
      • 原始请求:User-Id: 100
      • 配置:SetRequestHeader=User-Id, 200
      • 最终结果:User-Id: 200(旧的 100 被丢弃了)

使用场景

  • 如果你是为了传递上下文(比如添加链路追踪 ID),且允许有多个值,用 Add
  • 如果你是为了篡改/强制修正(比如强制把 Content-Type 改成 application/json,或者强制覆盖恶意的 X-Forwarded-For),必须用 Set

Based on Spring Framework.