SpringCloud Gateway跨域CORS问题解决方案

2022-07-03 13:58:51

最近使用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跨域问题

  • 作者:FLY-DUCK
  • 原文链接:https://blog.csdn.net/fly_duck/article/details/111317581
    更新时间:2022-07-03 13:58:51