传统跨域是springboot中CorsRegistry添加添加处理的CorsMapping,这种跨域处理可以处理controller的请求。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
static final String[] ORIGINS = new String[] { "GET", "POST", "PUT", "DELETE" };
@Override
public void addCorsMappings(CorsRegistry registry) {
// 所有的当前站点的请求地址,都支持跨域访问。
registry.addMapping("/**")
// 所有的外部域都可跨域访问
.allowedOrigins("*")
// 是否支持跨域用户凭证
.allowCredentials(true)
// 当前站点支持的跨域请求类型是什么
.allowedMethods(ORIGINS)
// 超时时长设置为1小时,时间单位是秒。
.maxAge(3600);
}
}
但如果遇到spring boot集成spring security的时候,登录时处理是在filter中的,传统的跨域没有办法处理,这时候我们要采用一种新的实现方案:基于filter的跨域实现。
基于filter实现可以处理filter中的跨域问题,这里原理很简单,需要注意是要设置CorsFilter的优先级:Ordered.HIGHEST_PRECEDENCE(加载到过滤器链最前面!!!)
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addExposedHeader("*");
return corsConfiguration;
}
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 对接口配置跨域设置
source.registerCorsConfiguration("/**", buildConfig());
//有多个filter时此处设置改CorsFilter的优先执行顺序
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
经过测试,这种处理方法可以轻松应对springboot的跨域问题。