Skip to content

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-CredentialsAccess-Control-Allow-Origin 响应头中的重复值。这通常发生在网关本身的 CORS 逻辑和下游服务逻辑同时添加了这些 Header 的情况下。

策略参数 (Strategy):DedupeResponseHeader 过滤器还接受一个可选的 strategy 参数。可接受的值如下:

  • RETAIN_FIRST(默认值):保留第一个出现的值,移除后续重复值。
  • RETAIN_LAST:保留最后一个出现的值,移除前面的重复值。
  • RETAIN_UNIQUE:保留所有唯一值(去重后保留所有不重复的项)。

补充教学 —— 为什么要给响应头去重?

常见场景:跨域资源共享 (CORS)

  1. 下游服务(比如 Spring Boot 后端)配置了 @CrossOrigin,因此它返回的响应里带了 Access-Control-Allow-Origin: *
  2. 网关(Spring Cloud Gateway)也配置了全局 CORS 过滤器,它也给响应加了一个 Access-Control-Allow-Origin: *
  3. 结果:浏览器收到了两个一模一样的 Header:
    Access-Control-Allow-Origin: *, *
  4. 报错:浏览器规范通常不允许某些 CORS 头出现多次或包含多个值,这会导致前端报错,无法获取数据。

解决方案: 使用 DedupeResponseHeader 过滤器,配置策略为 RETAIN_FIRST(保留第一个),这样浏览器就只会收到一个干净的 Header,问题解决。


Based on Spring Framework.