SpringCloud Gateway跨域CORS问题解决方案

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

方案一 通过application.yml配置CORS跨域

通过application.yml配置的方式是Gateway官方文档介绍的方式,截图如下。CORS的常用的配置项有allowedOrigins,allowedMethods,allowedHeaders,allowCredentials等,详细的配置项可以参考Spring Framework CorsConfiguration

博主这边是使用的官方文档介绍的方式实现CORS跨域配置的,项目中Gateway的application.yml配置CORS示例如下:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false #开启从注册中心动态创建路由的功能
          lower-case-service-id: true #使用小写服务名,默认是大写

      # CORS配置
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - HEAD
              - POST
              - PUT
              - DELETE
              - TRACE
              - OPTIONS
              - PATCH
            allowedHeaders: "*"

 

方案二 通过Java Bean代码配置CORS跨域

我们也可以在Java代码中通过Java Bean的方式来配置CORS跨域,该方式也是可以实现网关Gateway的CORS跨域配置。示例代码如下:

@Configuration
public class AppConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration config=new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        //设置预检请求的缓存时间(秒),在这个时间段里,对于相同的跨域请求不会再预检了
        config.setMaxAge(18000L);
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**",config);
        return new CorsWebFilter(source);
    }
}

 

注意事项

微服务中如果我们Gateway中配置了CORS跨域,其他微服务中就不要再配置CORS跨域,避免重复配置导致错误。

 

总结

在最开始发现跨域问题的时候首先就是采用的官网说明的application.yml配置CORS跨域的方案,该方案是可行的。博主的Spring Cloud版本为Greenwich.RELEASE,SpringBoot的版本为2.1.3.RELEASE,Gateway的版本为2.1.0.RELEASE,所以更高的版本通过application.yml配置的方式肯定是可行。同时也使用Java Bean代码的方式测试了CORS跨域的配置,也是可行。其实方案一和方案二最终都是通过CorsConfiguration来配置的CORS跨域,application.yml的方式是Gateway已经帮我们实现了CorsConfiguration,具体的源码没有深入的研究。本文记录了Gateway网关两种配置CORS跨域的方案,博主采用了官方介绍的application.yml配置的方案实现了CORS跨域配置。在学习跨域配置的时候,同时也查阅了网上的一些博客,选择了几篇又代表的博客作为参考博客(见 参考博客 小节)。文中如果有描述不正确的地方,希望各位博友反馈。该篇文章主要记录一下Gateway网关如何配置CORS跨域,同时希望其他网友遇到该问题可以提供一些帮助。

 

参考博客

Spring Cloud Gateway跨域相关解决方案

SpringCloudGateway CORS方案看这篇就够了

spring cloud gateway跨域问题

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud GatewaySpring Cloud生态圈中的一个API网关,它提供了一种构建微服务架构的解决方案跨域是Web开发中常见的问题,特别是在微服务架构中,不同服务之间需要进行跨域访问。本篇文章将介绍使用Spring Cloud Gateway实现跨域的方法。 首先,需要在Spring Cloud Gateway中添加Corsconfiguration Bean,代码如下: @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("*")); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); configuration.setAllowedHeaders(Arrays.asList("Content-Type", "Authorization")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } 然后,在application.yml文件中添加跨域配置,代码如下: spring: cloud: gateway: globalcors: corsConfigurations: '[/**]': allowedOrigins: "*" allowedMethods: - GET - POST - PUT - DELETE allowedHeaders: - "Content-Type" - "Authorization" allowCredentials: true maxAge: 3600 这里设置了允许的来源,方法和头部,还指定了是否允许发送cookie信息,以及最大响应时间。此外,您也可以通过使用代码配置来自定义跨域规则,具体请参考Spring Cloud Gateway官方文档。 最后,在需要进行跨域访问的路由前添加跨域过滤器,代码如下: @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("path_route", r -> r.path("/hello") .filters(f -> f.addRequestHeader("Hello", "World") .addFilter(new CrossOriginFilter())) .uri("http://localhost:8081")) .build(); } 在这个例子中,我们将拦截/hello路由,并添加一个跨域过滤器。 总结来说,使用Spring Cloud Gateway实现跨域需要以下步骤:添加Corsconfiguration Bean,配置application.yml文件,添加跨域过滤器。这样,在微服务架构中实现跨域问题就变得容易了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FLY-DUCK

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值