Spring Cloud Gateway的CORS配置

前言

最近在学习SpringCloud,配置CORS策略的时候遇到了问题。当接口被鉴权框架SaToken拦截的时候,浏览器里拿不到返回的响应,同时控制台报错CORS响应头未配置。但是当鉴权通过时,CORS响应头则是正常的。

原因分析

通过阅读源码,发现SpringCloudGateway对于CORS有两种实现方式,一种是通过过滤器的方式CorsWebFilter,另一种是AbstractHandlerMapping,两者最终都调用了DefaultCorsProcessor来设置响应头。在默认情况下,使用了AbstractHandlerMapping来实现这个功能。根据官方文档,通过在配置文件中配置spring.cloud.gateway.globalcors.corsConfigurations就可以实现CORS策略的配置,这在通常情况下是可用的。但是当使用SaToken这种基于WebFilter实现的鉴权框架时就会失效。因为一个HTTP请求会先经过WebFilter然后才会到达AbstractHandlerMapping,当请求被鉴权框架拦截后,自然无法到达AbstractHandlerMapping,所以就无法完成CORS相关的处理。

解决方案

使用CorsWebFilter来实现CORS

1
2
3
4
5
6
7
8
9
10
@Configuration
class CorsConfig {

@Bean
@Order(-1)
fun corsWebFilter(globalCorsProperties: GlobalCorsProperties) =
CorsWebFilter(UrlBasedCorsConfigurationSource().apply {
setCorsConfigurations(globalCorsProperties.corsConfigurations)
})
}

通过注入GlobalCorsProperties来使用配置文件中CORS的配置,创建CorsWebFilter并注入到Spring中,同时提高优先级,让其在SaToken的过滤器之前执行,这样就能在使用SaToken的前提下正常配置CORS

作者

udp_bbr

发布于

2023-05-21

更新于

2023-05-21

许可协议