项目中偶尔遇到即使加了@CrossOrigin跨域失败:
第一次遇到时间有限没解决:前端直接添加跨域处理。
jQuery.support.cors = true;
后续第二次遇到该问题,作为后端不能让前端解决跨域问题。
debug详细查找原因:发现在自定义拦截器返回失败,跨域失败。
明白该问题:需要以下知识。
(mvc拦截器的链路模式)
(Cors拦截器加载)
(自定义的拦截器加载)
(拦截器的加载顺序)
因为拦截器是链路模式:CrossOrigin也是拦截器在自定义拦截器之后。所以在自定义拦截器失败后,处理
跨域的拦截器未处理,造成跨域失败。
解决该问题的办法:
添加filter ,因为Filter优先于拦截器执行,所以自己创建的拦截器不会影响跨域处理。
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
二:springboot升级到2.2.0,在新版本的springmvc中,把cors拦截添加到了拦截器的第一位,所以不会有该问题。
如果允许可以直接升级springboot或mvc版本。