背景
在与前端对接的过程中,由于不同域的问题,导致出现了跨域请求的问题。
缘由
查询了一系列的资料,发现是由于Spring security拦截了Options的请求,导致跨域请求无法做预判请求处理。
解决方案
只要让CORS过滤器放置在Spring security filter chain之前就可以解决问题。同时,为了保证在访问边缘子服务的时候,不会出现Headers内部包含多个跨域信息的情况导致无法访问边缘子服务。子服务本身不做跨域方案,跨域请求在网关统一处理。
具体步骤如下:
- 第一步,网关映射边缘子服务,并且显示设置
SensitiveHeaders
为空,防止网关拦截headers内的跨域信息; - 第二步,在网关内,定义
CORSFilter
,并将跨域过滤器防止在ChannelProcessingFilter
过滤器之前;
第二步相关代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @Configuration @EnableOAuth2Sso @EnableResourceServer @Order(0) public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override public void configure(HttpSecurity http) throws Exception { http.addFilterBefore(corsFilter(), ChannelProcessingFilter.class); }
@Bean public Filter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
|