SpringBoot中CorsMappings和Interceptor发生冲突失效

在前后端分离的项目中,必定会遇到请求跨域的问题,我们解决跨域一般有两种情况,往下看:

第一种方法就是自定义一个跨域Bean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(false)
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").allowedOrigins("*");
}
};
}

}

从代码中我们可以看到,其实就是定义了一个WebMvcConfigurer的实例,然后实现了addCorsMappings()方法,在方法中进行了跨域注册,这里的代码中设置的addMapping("/**"),意思是所有的资源(动态+静态)均允许跨域,如果仅仅设置某些资源允许跨域请求,这里只需要指定响应的路径即可,例如addMapping("/doc.html"),多个路径的话,设置多条即可。


第二种方法则是定义一个WebMvcConfigurer的子类,在子类中实现addCorsMappings方法,方法内容和第一种相似,就不细讲了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
@EnableWebMvc
public class HttpConverterConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(false).allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.allowedOrigins("*");
}

}

第三种方法,是自定义CorsFilter的实例,并将其注册到Spring容器中,在项目中使用了拦截器HandlerInterceptor的时候,只有使用该方法才能设置成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
@EnableWebMvc
public class HttpConverterConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/doc**", "/swagger**", "/webjars/**");
}

@Bean
public CorsFilter corsFilter() {

CorsConfiguration config = new CorsConfiguration();
// 设置允许跨域请求的域名
config.addAllowedOrigin("*");
// 设置允许的方法
config.addAllowedMethod("*");
// 允许任何头
config.addAllowedHeader("*");
config.addExposedHeader("token");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}

@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor();
}

}