后端解决跨域的两种方式与 gateway 关闭 CORS

概述

以往遇到跨域问题的时候,一般采用Nginx 的反向代理功能。本文记录「后端层面(Spring)解决该问题」。

代码

为单个 Controller 解决

添加 @CrossOrigin 注解即可。

实现WebMvcConfigurer接口解决


@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        /**
         * addMapping 适用于所有的接口
         * allowedOrigins 适用于所有的地址
         * allowedHeaders 允许自定义请求头
         * allowedMethods 适用于所有请求方式
         * allowCredentials 允许携带验证
         * maxAge 允许时间
         *
         */
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedHeaders(CorsConfiguration.ALL)
                .allowedMethods(CorsConfiguration.ALL)
                .allowCredentials(true)
                .maxAge(3600);

    }
}

其他场景

以上可以解决大部分的跨域问题,但当在 SpringCloud 中应用 gateway 的时候就出现了无效的问题。
经过测试,是被 gateway 拦截的,我一直纠结是不是实现的WebMvcConfigurer 接口出现了问题,耽误了很长时间。网络上的文章也是抄来抄去,实际上并不可用。

之所以被 gateway 拦截是因为它并不属于 SpringMVC 而是 webflux,所以上面关闭 CORS 的方式对它无效,需要去关闭它的 CORS

spring:
 application:
   name: gateway
 cloud:
   gateway:
     globalcors:
         corsConfigurations:
           '[/**]':
              allowedOrigins: "*"
              allowedMethods: "*"
              allowedHeaders: "*"