addCorsMappings存在的问题
通过一段时间在SpringBoot使用的摸爬滚打,发现网络上的资料通常为统一配置解决跨域问题提供了两种代码,第一种比较短,是通过创建MyWebMvcConfig
类实现WebMvcConfigurer
接口中的addCorsMappings
方法。
具体的代码如下:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
因为代码较短,作为新手自然也喜欢更加简洁的代码,这在项目开始阶段似乎能够解决问题。
但是后续如果添加自定义的拦截器(包括Spring security),addCorsMappings
方法实现的统一跨域配置就会失效,其原因在于请求经过的先后顺序:
当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。
第二种方法,实现一个CORS拦截器
既然请求会先进入拦截器中,那么你可以尝试“以毒攻毒”,实现一个CORS拦截器:
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//放行任意原始域。放行单个原始域。使用config.addAllowedOrigin("yourdomain.com")
config.addAllowedOriginPattern("*");
//是否发送Cookie信息
config.setAllowCredentials(true);
//放行哪些请求方式。放行任意请求方式可以使用:config.addAllowedMethod("*")
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
//放行任意请求头
config.addAllowedHeader("*");
//2.添加映射路径
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}