在 Spring Cloud Gateway 中实现跨域(CORS)的两种主要方式

使用 Spring Cloud Gateway 解决跨域问题 Spring Cloud Gateway是Spring Cloud家族中的一个组成部分,为了解决微服务架构中的API网关问题而生。在实际应用场景中,有时候会遇到跨域问题,可以通过Spring Cloud Gateway来解决。 阅读详情

在 Spring Cloud Gateway 中实现跨域(CORS)主要有 两种方式:

  1. 通过配置类方式(推荐) - 使用 CorsWebFilter
  2. 通过配置文件方式(YAML/Properties)

🚀 推荐方式:使用 CorsWebFilter 配置类(更灵活、可控)

✅ 为什么推荐?

  • 精确控制跨域行为(路径、方法、Header 等)
  • 支持动态配置(如从数据库读取)
  • 与 Spring WebFlux 完全兼容(Gateway 基于 WebFlux)
  • 不依赖路由配置,全局生效或按需生效

📌 完整示例:使用 CorsWebFilter 实现跨域

第一步:创建跨域配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

/**
 * Spring Cloud Gateway 跨域配置类
 * 
 * 说明:
 * - 本配置使用 CorsWebFilter 实现全局跨域支持
 * - 适用于 Spring Cloud Gateway 2020.0.0 及以上版本(基于 Spring WebFlux)
 * - 该 Filter 会在请求进入路由之前生效,确保 OPTIONS 预检请求被正确处理
 */
@Configuration(proxyBeanMethods = false)
public class CorsConfig {

    /**
     * 创建 CorsWebFilter Bean,用于处理跨域请求
     * 
     * @return 配置好的 CorsWebFilter 实例
     */
    @Bean
    public CorsWebFilter corsWebFilter() {
        // 1. 创建 CorsConfiguration 对象,用于定义跨域规则
        CorsConfiguration corsConfiguration = new CorsConfiguration();

        // 2. 允许的请求来源(Origin)
        // 注意:生产环境不要使用 "*",应明确指定可信域名
        corsConfiguration.addAllowedOriginPattern("*"); // Spring Boot 2.4+ 推荐使用 addAllowedOriginPattern 代替 addAllowedOrigin
        // 如果你使用的是较老版本(<2.4),请使用:corsConfiguration.addAllowedOrigin("*");

        // 3. 允许携带 Cookie(如果前端需要发送认证信息如 JWT Token)
        corsConfiguration.setAllowCredentials(true);

        // 4. 允许的 HTTP 方法
        corsConfiguration.addAllowedMethod("GET");
        corsConfiguration.addAllowedMethod("POST");
        corsConfiguration.addAllowedMethod("PUT");
        corsConfiguration.addAllowedMethod("DELETE");
        corsConfiguration.addAllowedMethod("OPTIONS");

        // 5. 允许的请求头(Header)
        // 常见的如 Content-Type, Authorization, X-Requested-With 等
        corsConfiguration.addAllowedHeader("*"); // 允许所有请求头(生产环境建议明确列出)

        // 6. 暴露给前端的响应头(可选)
        corsConfiguration.addExposedHeader("Authorization");
        corsConfiguration.addExposedHeader("Content-Disposition");

        // 7. 预检请求(OPTIONS)缓存时间(单位:秒)
        corsConfiguration.setMaxAge(3600L); // 1小时,减少预检请求次数

        // 8. 创建 UrlBasedCorsConfigurationSource,将 CORS 配置应用到所有路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration); // /** 表示匹配所有路径

        // 9. 返回 CorsWebFilter,Spring Gateway 会自动将其加入过滤器链
        return new CorsWebFilter(source);
    }
}

第二步:确保你的 application.yml 中没有冲突配置

spring:
  cloud:
    gateway:
      # 路由配置示例(与跨域无关,仅为完整上下文)
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
  # 注意:不要在这里配置 globalcors(除非你选择配置文件方式)

⚠️ 重要提示:如果你同时使用了 globalcors 配置和 CorsWebFilter,可能会导致冲突。建议只使用一种方式。


🔁 替代方案:使用 application.yml 配置(简单但不够灵活)

如果你只需要简单跨域,也可以在 application.yml 中配置:

spring:
  cloud:
    gateway:
      # CORS 跨域配置,CORS 是网关的责任,而不是业务服务的负担
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有路由路径(/** 表示所有 API 路径都应用此 CORS 规则)
            # 使用 allowed-origin-patterns 替代 allowedOrigins(支持通配符模式,更安全灵活)
            allowed-origin-patterns:
              - "http://localhost:*"      # 开发环境,允许本地开发环境(任意端口)发起跨域请求
              - "https://yourdomain.com"  # 生产环境,允许指定的生产域名访问
              - "https://*.yourcompany.com" # 允许 yourcompany.com 的所有子域名访问
            # 允许的 HTTP 请求方法(前端可以使用这些方法发起跨域请求)
            allowed-methods:
              - GET     # 允许获取资源(如查询用户信息、列表数据等)
              - POST    # 允许提交数据(如创建用户、提交表单等)
              - PUT     # 允许全量更新资源(如修改用户完整信息)
              - DELETE  # 允许删除资源(如删除订单、用户等)
              - OPTIONS # 允许预检请求(浏览器自动发送,用于 CORS 预检,必须包含!)
              - PATCH   # 允许部分更新资源(如只修改用户邮箱或昵称)
            # 允许客户端在跨域请求中携带的自定义请求头(Header)
            # 如果前端请求中包含未在此列出的 Header,浏览器会拦截并报 CORS 错误
            allowed-headers:
              - "Content-Type"       # 允许指定请求体的媒体类型(如 application/json)
              - "Authorization"      # 允许携带认证令牌(如 Bearer JWT Token)
              - "X-Requested-With"   # 常用于标识 AJAX 请求(部分前端框架自动添加)
              - "Accept"             # 允许客户端声明可接受的响应内容类型(如 application/json)
            # 是否允许跨域请求携带身份凭证(如 Cookie、Authorization Header)
            # 注意:当 allow-credentials 为 true 时,allowed-origin-patterns 不能为 "*"
            allow-credentials: true
            # 预检请求(OPTIONS)的缓存时间(单位:秒)
            # 浏览器在该时间内不会再发送 OPTIONS 请求,提升性能
            max-age: 3600  # 缓存 1 小时(3600 秒)

❗ 注意:在最新版本的 Spring Cloud Gateway 中,spring.cloud.gateway.globalcors.cors-configurations 被标记为:弃用的配置属性,IDEA 提示推荐使用 spring.cloud.gateway.server.webflux.globalcors.cors-configurations

spring:
  cloud:
    gateway:
      server:
        webflux:
          # CORS 跨域配置,CORS 是网关的责任,而不是业务服务的负担
          globalcors:
            cors-configurations:
              '[/**]': # 匹配所有路由路径(/** 表示所有 API 路径都应用此 CORS 规则)
                # 使用 allowed-origin-patterns 替代 allowedOrigins(支持通配符模式,更安全灵活)
                allowed-origin-patterns:
                  - "http://localhost:*"      # 开发环境,允许本地开发环境(任意端口)发起跨域请求
                  - "https://yourdomain.com"  # 生产环境,允许指定的生产域名访问
                  - "https://*.yourcompany.com" # 允许 yourcompany.com 的所有子域名访问
                # 允许的 HTTP 请求方法(前端可以使用这些方法发起跨域请求)
                allowed-methods:
                  - GET     # 允许获取资源(如查询用户信息、列表数据等)
                  - POST    # 允许提交数据(如创建用户、提交表单等)
                  - PUT     # 允许全量更新资源(如修改用户完整信息)
                  - DELETE  # 允许删除资源(如删除订单、用户等)
                  - OPTIONS # 允许预检请求(浏览器自动发送,用于 CORS 预检,必须包含!)
                  - PATCH   # 允许部分更新资源(如只修改用户邮箱或昵称)
                # 允许客户端在跨域请求中携带的自定义请求头(Header)
                # 如果前端请求中包含未在此列出的 Header,浏览器会拦截并报 CORS 错误
                allowed-headers:
                  - "Content-Type"       # 允许指定请求体的媒体类型(如 application/json)
                  - "Authorization"      # 允许携带认证令牌(如 Bearer JWT Token)
                  - "X-Requested-With"   # 常用于标识 AJAX 请求(部分前端框架自动添加)
                  - "Accept"             # 允许客户端声明可接受的响应内容类型(如 application/json)
                # 是否允许跨域请求携带身份凭证(如 Cookie、Authorization Header)
                # 注意:当 allow-credentials 为 true 时,allowed-origin-patterns 不能为 "*"
                allow-credentials: true
                # 预检请求(OPTIONS)的缓存时间(单位:秒)
                # 浏览器在该时间内不会再发送 OPTIONS 请求,提升性能
                max-age: 3600  # 缓存 1 小时(3600 秒)

❗ 注意:YAML 方式在 Spring Cloud Gateway 2020.0.0+ 中仍然有效,但 无法处理复杂逻辑(如动态来源、条件判断等)。


🧪 测试跨域是否生效

你可以用前端代码测试:

// 前端 JavaScript 测试(浏览器控制台)
fetch('http://localhost:8080/api/user/profile', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer your-token'
  },
  credentials: 'include' // 如果需要发送 Cookie
})
.then(res => res.json())
.then(data => console.log(data));

同时用 Postman 或 curl 发送 OPTIONS 请求验证:

curl -H "Origin: http://localhost:3000" \
     -H "Access-Control-Request-Method: POST" \
     -H "Access-Control-Request-Headers: Authorization" \
     -X OPTIONS http://localhost:8080/api/user/login

如果返回头中包含:

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Credentials: true

说明跨域配置成功!


✅ 最佳实践建议

项目建议
生产环境 Origin不要使用 *,应明确列出可信域名,如 http://yourdomain.com
Allow Credentials如果使用 JWT Token 放在 Header,可设为 true;若用 Cookie 认证,必须为 true
Allowed Headers生产环境建议明确列出,如 Authorization, Content-Type, X-Requested-With
配置方式选择优先使用 CorsWebFilter 配置类,便于维护和扩展

📚 总结

  • 推荐方式:使用 @Configuration + CorsWebFilter(本文第一种方式)
  • 适用场景:所有 Spring Cloud Gateway 项目(2020.0.0+)
  • 优势:灵活、安全、可编程、与 WebFlux 完美集成

💡 提示:Spring Cloud Gateway 是响应式架构(基于 WebFlux),不要使用 Spring MVC 的 @CrossOrigin 或 WebMvcConfigurer,它们在 Gateway 中无效!

Spring Cloud gateway 跨域问题 1、在和axios联调鉴权的时候发现,在增加自定义header的时候会出现跨域问题 2、因为是跨域请求,前端会首先发送一个options的嗅探请求,一次真正的请求 所以会出现两个403 3、网关之前设置的是全局filter 刚开始看了 package com.xxx.filter; import com.alibaba.fastjson.JSONObject; import com.x... 阅读详情

相关推荐

nginx 和 springcloud gateway cors 跨域如何设置

在跨域资源共享(CORS)配置中,和(如Spring Cloud Gateway、Kong等)是两种常见的解决方案,它们的配置逻辑和适用场景有所不同。

隔壁老瓦的专栏 1166

Spring Cloud Gateway系例—参数配置(CORS 配置、SSL、元数据)

Spring Cloud Gateway系例—参数配置(CORS 配置、SSL、元数据)

深圳市多克创新科技有限公司 2320

Spring Cloud Gateway 跨域出现“Multiple CORS header”多重跨域

yml配置 spring: cloud: gateway: #解决双重跨域 default-filters: - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_UNIQUE globalcors: cors-configurations: '[/**]':

u014019974的专栏 1104

SpringCloudGateway CORS方案看这篇就够了

在Spring Cloud项目中,前后端分离目前很常见,在调试时,会遇到两种情况的跨域: 前端页面通过不同域名或IP访问微服务的后台,例如前端人员会在本地起HttpServer 直连后台开发本地起的服务,此时,如果不加任何配置,前端页面的请求会被浏览器跨域限制拦截,所以,业务服务常常会添加如下代码设置全局跨域: 1 2 3 4 5 6 7 8 9 10 11 12 13 @Bean public CorsFilter corsFilter() { logger.

weixin_40760196的博客 6056

Spring Boot中的跨域资源共享(CORS)处理

本文介绍了Spring Boot中处理CORS的多种方法,包括使用注解、配置类、全局配置、自定义过滤器以及与Spring Security、Zuul和Spring Cloud Gateway的结合使用。浏览器在发送实际的跨域请求之前,会先发送一个预请求(OPTIONS请求),以确认服务器是否允许跨域请求。在使用Spring Security的情况下,CORS的处理需要与Spring Security的配置结合。Spring Boot提供了几种方式来处理CORS,包括使用注解、配置类和全局配置。

省赚客开发者博客 1050

Spring Cloud Gateway:CORS配置

可以在Spring Cloud Gateway上全局或每个路由上配置跨域资源共享(CORS)行为。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 2259

关于Spring Cloud Gateway中 Filters的理解

Filters拦截器的作用是,对请求进行处理可以进行⭐例子访问 http://localhost:8080/api/name 自动跳转到 http://localhost:8123/api/namehttp://localhost:8123/api/name 后端中获取request.getHeader(“ylx”) 中的请求头,打印出来666说明添加请求头成功我们可以通过在请求头上添加信息,特定的标识,可以实现对接口的保护,确保只有带有这个请求头的请求才能被下游的服务认可并允许调用。

m0_59751050的博客 2162

Spring Cloud Gateway 超时、CORS配置 | Spring Cloud 17

`Spring Cloud Gateway` 可以为所有路由配置 `Http 超时(响应和连接)`,并为每个特定路由覆盖设置。 `Spring Cloud Gateway`可以为网关配置全局或单路由的跨域行为控制。两者都提供相同的特性。

gmHappy 8022

Spring Cloud Gateway -- Cors解决跨域问题

Spring Cloud Gateway -- Cors解决跨域问题前言Cors 前言 由于前后端分离就会碰到跨域问题,原本我们在后端采用Cors就能解决,现在利用网关,那么就放在网关这层做好了。 Cors /** * 跨域允许 */ @Configuration public class Cors { private static final String MAX_AGE = "18...

a294634473的博客 2万+

【云原生】 Spring Cloud Alibaba 之 Gateway 服务网关跨域问题

Spring Cloud Alibaba Gateway 跨域问题如何解决? 一招教你搞定!

wanghuichen的博客 5695

揭秘Spring Cloud Gateway在后端领域的跨域处理方案

本文旨在为开发人员提供Spring Cloud Gateway中跨域处理的全面指南。CORS在微服务架构中的重要性Spring Cloud Gateway的CORS处理机制不同配置方式的适用场景和性能考量文章首先介绍CORS的基本概念和Spring Cloud Gateway的架构,然后深入技术实现细节,包括源码分析和配置示例。后续章节将展示实际应用案例和性能优化建议,最后讨论相关工具和未来发展趋势。CORS(跨源资源共享)

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1253

SpringCloud Gateway跨域CORS问题解决方案

最近使用SpringCloud搭建微服务,使用Gateway网关统一对外提供API接口,项目使用前后端分离,前端开发对接接口的时候抛出接口提示跨域问题不能调用。才注意到Gateway网关没有跨域相应的配置,默认情况下,是不允许任何跨源请求的,必须显式配置以指示应允许的内容。通过官网文档查阅、网上其他网友总结,最后使用官方文档描述的方法通过配置的方式解决了Gateway网关跨域的问题。 spring: cloud: gateway: discovery: lo.

fly_duck的博客 4088

【SpringCloud】9、Spring Cloud Gateway跨域配置

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。

JACKAL 3万+

Spring Cloud Gateway 跨域以及报错解决

【请求网关转发时,报错503】 注意application.yml中,配置routes时: spring: application: name: getway-service cloud: gateway: routes: - id: pms-route #注意id前面的 - 要与routes对齐,不然调用服务时会出现503错误 ...

Timeguys的专栏 4477

别再只调包了!深入理解机器学习虚拟筛选中的分子指纹(ECFP/Morgan)

本文深入探讨了ECFP/Morgan分子指纹在机器学习虚拟筛选中的应用与优化策略。通过解析半径参数与比特长度的化学意义,揭示了如何通过参数调优提升模型性能20%以上,特别适用于药物发现领域的高通量筛选。文章还提供了工程实践中的参数优化策略和多指纹融合技术,为开发者提供从理论到实践的全面指导。

weixin_33704234的博客 828

2017全国大学生电子设计大赛B题 | 板球控制系统(四)机械设计相关

转载请注明出处。   转眼2019了诶,可能有些同学又该问了,哇向阳哥,你这个鸽子放的好,转眼大半年了一年都没更新,我也知道啊,说好的源码呢,挖的机械的坑呢?咕咕咕咕我也不想啊,我这不是懒吗!过年有空了,又到了收红包泡妹子玩游戏.......呸,学习准备比赛码代码的时候了,终于有点空闲,于是乎今晚先把机械的大坑填了。     咱话先说在最前面。机械这玩意,靠经验,也考想象力,更要命的还是出了...

王向阳的博客 3万+

Spring Cloud Gateway CORS跨域配置:全局与路由级跨域策略

Spring Cloud Gateway CORS跨域配置是微服务架构中解决前端应用访问问题的关键技术。作为基于Spring Framework和Spring Boot构建的API网关,Spring Cloud Gateway提供了灵活的CORS配置机制,支持全局统一配置和路由级精细化控制。本文将详细介绍如何通过Spring Cloud Gateway配置CORS跨域策略,帮助开发者快速解决前端跨

gitblog_00817的博客 1104

大模型-internvl高通qnn运行源码解读

模型链接:https://huggingface.co/OpenGVLab/InternVL2-2B论文官方简要说明 https://internvl.github.io/blog/2024-07-02-InternVL-2.0中文解读 https://zhuanlan.zhihu.com/p/702946079在线demo https://internvl.opengvlab.com/

点滴的岁月 1832

Spring Cloud Gateway解决跨域问题

Spring Cloud Gateway解决跨域问题1、什么是跨域2、为什么会有跨域问题3、Spring Cloud Gateway解决跨域问题3.1 搭建server-gateway模块3.2 引入相关依赖3.3 resources下添加配置文件3.4 启动类3.5 解决跨域问题3.6 服务调整3.7 测试 1、什么是跨域   跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源是指,域名,协议,端口均相同。 也就是说域名、协议、端口只要有一处不同,就会产

冲出仁川,走出马德里,故事还会再继续 5348

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1076

Xilinx平台SRIO介绍(二)SRIO IP核基础知识

使用SRIO IP核必须掌握的基础知识! 理解了这篇,剩下的只是代码罢了。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 4万+

Spring Cloud Gateway CORS 方案 一次说清楚~

CORS跨域是一个开发中经常会遇到的问题,在SpringBoot单体项目中我们只需要添加一个Filter即可解决,而在SpringCloud微服务中并非如此顺利,希望通过本文可以帮你一次解决~

m0_46995061的博客 1292

Python实战:打造学生信息管理系统

通过本教程,我们构建了一个简单的学生信息管理系统,实现了基本的添加、删除、修改和查询功能。当然,这个系统还有很多可以改进和扩展的地方,比如添加用户界面、增加数据持久化功能、支持批量操作等。简介:本文将介绍如何使用Python编写一个功能齐全的学生信息管理系统,包括添加、删除、修改和查询学生信息的基本操作。学生信息管理系统是学校日常管理中不可或缺的一部分,它能够帮助管理人员快速、准确地管理学生信息,提高工作效率。为了实现上述功能,我们可以设计一个包含学生信息的字典,并使用函数来封装各个操作。

铭渊老黄 1488

spring cloud 跨域CORS 报错 403

spring cloud 跨域CORS 报错 403 针对这个问题,之前是在zuul中过滤器配置跨域: HttpServletRequest request = ctx.getRequest(); HttpServletResponse response = ctx.getResponse(); response.setHeader("Access-Control-Allow-Heade...

sinat_24619961的博客 2935

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1522

基于深度学习的堰塞坝表层颗粒物质识别研究

本文提出一种基于深度学习的堰塞坝表层颗粒物质智能识别方法,针对颗粒分布散乱、背景复杂的问题,采用"大颗粒逐个识别、密集小颗粒分块识别"策略。结合Mask R-CNN、SLIC和AlexNet构建识别模型,通过无人机影像实现自动识别。实验表明该方法精度超过90%,具备迁移能力。文章提供了Python实现代码,涵盖数据预处理、SLIC分割、模型构建(Mask R-CNN和AlexNet)及训练流程,为堰塞坝应急抢险提供技术支持。

huanghm88的专栏 179
上一篇: 3、Spring Boot 3 嵌套配置绑定实战示例
下一篇: 1、Lombok入门与环境配置:理解Lombok作用、配置IDE与构建工具
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值