Spring cloud gateway 跨域配置与碰到的问题

使用Spring cloud gateway 创建的一个网关服务后,在application.yml中配置跨域,如下:

复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: xxxxx
          uri: https://www.xxxxx.com
          predicates:
            - Path=/xxx/**
          filters:
            - StripPrefix=1
      globalcors:
        # 解决OPTIONS请求被拦截问题
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]':
            # 允许跨域的请求源(Spring Boot 2.4+版本使用此配置)
            allowedOriginPatterns: ["*"]
            allowedMethods: ["*"]
            allowedHeaders: ["*"]
            # 是否允许携带cookie
            allowCredentials: true
            # 跨域检测的有效期,单位秒
            maxAge: 3600

注意事项:

  • 凭证与通配符限制 ‌:当allow-credentials设置为true时,allowed-origins 不能设置为 "*",必须指定具体域名
  • ‌options请求处理 ‌:必须配置add-to-simple-url-handler-mapping: true来确保预检请求不被拦截
  • ‌版本兼容性 ‌:Spring Boot 2.4及以上版本推荐使用allowed-origin-patterns替代allowed-origins

Spring Cloud Gateway配置跨域后确实会在响应头中添加跨域相关配置。

在一些微服务场景下,比如调用第三方服务的时候,第三方服务有可能也配置了跨域配置,如果这时,我们网关服务也配置了跨域配置,就会在响应头中出现多个Access-Control-Allow-Origin 响应头,从而导致跨域配置失效。

为避免出现多个Access-Control-Allow-Origin响应头,需要使用DedupeResponseHeader 过滤器来去重响应头

DedupeResponseHeader过滤器‌的作用:

  • 用于去除重复的响应头
  • 可指定多个需要去重的响应头名称,用空格分隔
  • 支持多种去重策略,如RETAIN_FIRST(保留第一个)、RETAIN_LAST(保留最后一个)等

完整的配置如下:

复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: xxxxx
          uri: https://www.xxxxx.com
          predicates:
            - Path=/xxx/**
          filters:
            - StripPrefix=1
      globalcors:
        # 解决OPTIONS请求被拦截问题
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]':
            # 允许跨域的请求源(Spring Boot 2.4+版本使用此配置)
            allowedOriginPatterns: ["*"]
            allowedMethods: ["*"]
            allowedHeaders: ["*"]
            # 是否允许携带cookie
            allowCredentials: true
            # 跨域检测的有效期,单位秒
            maxAge: 3600
      default-filters:
        # 使用RETAIN_FIRST策略确保保留最先设置的响应头值,也就是网关的跨域配置
        - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
相关推荐
Dovis(誓平步青云)1 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
yuniko-n1 小时前
【Java】字符串相关坑点
java·开发语言·python
Terra.K1 小时前
Spring AI day1(SSE+AI)
java·人工智能·spring·springai
斑鸠喳喳1 小时前
线程本地存储 ThreadLocal
java·后端
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
DongQiShanRen2 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
cpolar技术支持3 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
wuminyu3 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长3 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔3 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言