SetRequestHeader GatewayFilter 工厂
SetRequestHeader GatewayFilter 工厂接受 name 和 value 两个参数。 以下示例配置了一个 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 的区别?
很多同学搞不清楚 AddRequestHeader 和 SetRequestHeader 的区别,因为它们看起来都是“给 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。