WhatAKitty Daily

A Programmer's Daily Record

Spring微服务架构下跨域问题解决方案

WhatAKitty   阅读次数loading...

背景

在与前端对接的过程中,由于不同域的问题,导致出现了跨域请求的问题。

缘由

查询了一系列的资料,发现是由于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);
}

/**
* 跨域过滤器
*
* @return 过滤器
*/
@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);
}
}