springboot处理跨域问题,用过3个处理方式,下面分别介绍下
1.@CrossOrigin
可以在方法上加@CrossOrigin注解,实现跨域处理,该注解适用于部分方法需要跨域请求的模式,可以通过指定origins参数,配置允许访问的相关路径信息
该注解的默认配置为:
"Access-Control-Allow-Origin" : "*"
"Access-Control-Allow-Methods" : "GET,POST,PUT,OPTIONS"
"Access-Control-Allow-Credentials" : "true"
2.跨域的全局处理
springboot2.* 版本, 实现WebMvcConfigurer 里的addCorsMappings 方法
springboot1.* 版本,实现WebMvcConfigurerAdapter 里的addCorsMappings方法
@Configuration
public class corsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 允许跨域请求路径
registry.addMapping("/**")
// 允许跨域请求域名
.allowedOrigins("*")
// 允许的方法
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
// 时间
.maxAge(3600)
// 是否允许证书
.allowCredentials(true);
}
}
3.实现corsFilter
代码里面通过实现corsFilter实现跨域
@Configuration
public class MyCorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
在项目试验中,在使用springboot1.5.20.RELEASE的时候,@CrossOrigin与.WebMvcConfigurerAdapter 并没有生效,导致请求依然报跨域问题,CorsFilter可以正常使用,在springboot 2.2.* 里面,WebMvcConfigurer 能正常解决跨域问题,之前百度查找的时候,有人给出的解释为请求经过的先后顺序问题,请求会先进入到自定义拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息,浏览器就会报跨域异常