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