- 可以使用@CrossOrigin,但是如果自定义了拦截器,还会出现跨域问题,因为拦截器比方法先触发
例如:
添加@CrossOrigin
自定义了拦截器:
还会出现跨域问题:
- 通过配置类进行配置,同上如果自定义了拦截器还会出现跨域问题,添加的自定义拦截器是在跨域拦截器之前执行的,导致跨域拦截器失效。跨域拦截器代码如下所示:
@Configuration
public class corsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
}
- 解决方法:让跨域配置在登录拦截器之前执行。而Filter的执行顺序大于自定义拦截器,所以改为在Filter里实现跨域的配置。
跨域过滤器:
@Configuration
public class CorsConfig {
// 当前跨域请求最大有效时长。这里默认1天
private static final long MAX_AGE = 24 * 60 * 60;
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
corsConfiguration.setMaxAge(MAX_AGE);
source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
return new CorsFilter(source);
}
}