Gateway 不是使用的传统的SpringMVC,所以,针对SpringMVC的跨域设置,在Gateway中是不生效的。所以需要先关闭webflux的cors,再从gateway的filter里边设置cors就行了。
简单设置
代码配置:
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;
import org.springframework.web.util.pattern.PathPatternParser;
/**
* 跨域配置
*/
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有请求方法,例如get,post等
config.addAllowedMethod("*");
//允许所有的请求来源
config.addAllowedOrigin("*");
//允许所有请求头
config.addAllowedHeader("*");
//允许携带cookie
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
//对所有经过网关的请求都生效
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
Yaml 配置:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
# 允许携带认证信息
allow-credentials: true
# 允许跨域的源(网站域名/ip),设置*为全部
allowedOrigins: "*"
# 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
allowedMethods: "*"
# 允许跨域请求里的head字段,设置*为全部
allowedHeaders: "*"
经过上面设置,就可以处理简单的跨域问题。
多重跨域
有时候,网关调用的后端微服务,本身设置了跨域,Gateway 和下游系统同时支持了跨域,都会向 response header 中增加Access-Control-Allow-Origin *
,出现重复的 * ,导致跨域失效。在Gateway中可以使用 DedupeResponseHeader 来处理一下响应头重复的问题。
spring:
cloud:
gateway:
default-filters:
- DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
DedupeResponseHeader 有三个策略,我们使用RETAIN_UNIQUE即可:
- RETAIN_FIRST:仅保留第一个值(默认)。
- RETAIN_LAST:仅保留最后一个值。
- RETAIN_UNIQUE:按照第一次相遇的顺序保留所有唯一值。
注意: 该版本需要使用高版本的 Getaway,推荐使用 G 版以上。