Skip to content

SetResponseHeader GatewayFilter 工厂

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

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: setresponseheader_route
        uri: https://example.org
        filters:
        - SetResponseHeader=X-Response-Red, Blue

此 GatewayFilter 会替换(而不是添加)所有具有给定名称的 Header。 因此,如果下游服务响应原本包含 X-Response-Red:1234,通过该过滤器后,它将被替换为 X-Response-Red:Blue,这才是网关客户端(如浏览器)最终收到的值。

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

application.yml

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

补充教学 —— 为什么要修改响应头?

在网关层修改响应头(SetResponseHeader),通常有以下几个妙用:

  1. 隐藏敏感信息(安全)

    • 后端服务可能会返回一些暴露技术栈的 Header,比如 Server: Apache/2.4.6 (CentOS)X-Powered-By: ASP.NET
    • 这些信息可能被黑客利用来寻找特定版本的漏洞。
    • 做法:使用 SetResponseHeader=Server, My-Gateway 覆盖它,或者干脆用 RemoveResponseHeader 删掉它。
  2. 统一协议/格式

    • 微服务 A 返回 X-Trace-Id,微服务 B 返回 TraceId
    • 为了让前端处理更方便,网关可以统一将它们映射或重写为 X-Trace-Id
  3. 调试与标识

    • 你可以添加一个 X-Gateway-Node: node-1 来标识请求是由哪台网关机器处理的,方便排查问题。

记住 Set 与 Add 的区别

  • Add:如果有同名 Header,会变成列表 [旧值, 新值]
  • Set:直接把旧值踢开,霸道地占领位置,只保留 新值

Based on Spring Framework.