DedupeResponseHeader GatewayFilter 工厂
DedupeResponseHeader(响应头去重)GatewayFilter 工厂接受一个 name 参数和一个可选的 strategy(策略)参数。name 参数可以包含以空格分隔的 Header 名称列表。
以下示例配置了一个 DedupeResponseHeader GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin作用: 此配置将移除 Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin 响应头中的重复值。这通常发生在网关本身的 CORS 逻辑和下游服务逻辑同时添加了这些 Header 的情况下。
策略参数 (Strategy):DedupeResponseHeader 过滤器还接受一个可选的 strategy 参数。可接受的值如下:
RETAIN_FIRST(默认值):保留第一个出现的值,移除后续重复值。RETAIN_LAST:保留最后一个出现的值,移除前面的重复值。RETAIN_UNIQUE:保留所有唯一值(去重后保留所有不重复的项)。
补充教学 —— 为什么要给响应头去重?
常见场景:跨域资源共享 (CORS)
- 下游服务(比如 Spring Boot 后端)配置了
@CrossOrigin,因此它返回的响应里带了Access-Control-Allow-Origin: *。 - 网关(Spring Cloud Gateway)也配置了全局 CORS 过滤器,它也给响应加了一个
Access-Control-Allow-Origin: *。 - 结果:浏览器收到了两个一模一样的 Header:
Access-Control-Allow-Origin: *, * - 报错:浏览器规范通常不允许某些 CORS 头出现多次或包含多个值,这会导致前端报错,无法获取数据。
解决方案: 使用 DedupeResponseHeader 过滤器,配置策略为 RETAIN_FIRST(保留第一个),这样浏览器就只会收到一个干净的 Header,问题解决。