Spring实现跨域的方式有很多种,本文主要记录一下基于Filter的实现。
@Configuration
public class CorsConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
此处有两点需要说明一下:
- 当
allowCredentials
设置为true
时,allowedOrgin
不可以设置为*
; - filter的执行顺序是按照order的从小到大的顺序执行,跨域过滤器一般是需要最先执行的,所以尽可能的设置小一些。注:可以设置负数
补充:
跨域请求XHR获取response header中的自定义字段会报:Refused to get unsafe header "XXX"。 这个时候需要在响应头中设置Access-Control-Expose-Headers
。代码为:
configuration.addExposedHeader("xxx");