SetResponseHeader GatewayFilter 工厂
SetResponseHeader GatewayFilter 工厂接受 name 和 value 两个参数。 以下示例配置了一个 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),通常有以下几个妙用:
隐藏敏感信息(安全):
- 后端服务可能会返回一些暴露技术栈的 Header,比如
Server: Apache/2.4.6 (CentOS)或X-Powered-By: ASP.NET。 - 这些信息可能被黑客利用来寻找特定版本的漏洞。
- 做法:使用
SetResponseHeader=Server, My-Gateway覆盖它,或者干脆用RemoveResponseHeader删掉它。
- 后端服务可能会返回一些暴露技术栈的 Header,比如
统一协议/格式:
- 微服务 A 返回
X-Trace-Id,微服务 B 返回TraceId。 - 为了让前端处理更方便,网关可以统一将它们映射或重写为
X-Trace-Id。
- 微服务 A 返回
调试与标识:
- 你可以添加一个
X-Gateway-Node: node-1来标识请求是由哪台网关机器处理的,方便排查问题。
- 你可以添加一个
记住 Set 与 Add 的区别:
- Add:如果有同名 Header,会变成列表
[旧值, 新值]。 - Set:直接把旧值踢开,霸道地占领位置,只保留
新值。