14_Spring Boot 跨域(CORS)处理指南
在前后端分离的项目中,跨域请求(CORS)问题几乎是必然遇到的。本文将从 Spring Boot 版本判断 到 不同版本的跨域配置方式,做一个系统整理。
1️⃣ 查看 Spring Boot 版本
在 pom.xml
中可以查看 Spring Boot 的父级依赖版本:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2️⃣ Spring Boot < 2.4 的跨域处理
2.1 使用 CorsFilter
配置
java
@Configuration
public class CorsFilterConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// 指定允许的域名(* 表示所有,但如果要携带 Cookie,不可使用 *)
config.addAllowedOrigin("http://192.168.3.190");
config.setAllowCredentials(true); // 是否允许发送 Cookie
config.addAllowedMethod("*"); // 允许所有请求方法
config.addAllowedHeader("*"); // 允许所有请求头
config.setMaxAge(3600L); // 预检请求缓存时间(秒)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config); // 对所有请求应用配置
return new CorsFilter(source);
}
}
2.2 使用 WebMvcConfigurer
配置
java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://192.168.3.190") // 支持通配符
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
⚠️ 如果前端不需要携带 Cookie,可以允许所有来源。true 和 * 不能同时使用!!!
java
.allowedOrigins("*")
.allowCredentials(false)
3️⃣ Spring Boot ≥ 2.4 的跨域处理
Spring Boot 2.4 后,引入了 allowedOriginPatterns
,解决了 *
与 allowCredentials(true)
冲突的问题。
3.1 WebMvcConfigurer
示例
java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*") // 支持通配符
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true) // 支持 Cookie
.maxAge(3600);
}
}
3.2 CorsFilter
示例
java
@Configuration
public class CorsFilterConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOriginPattern("*"); // Spring Boot 2.4+ 支持通配符
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
4️⃣ 总结
- 低版本(<2.4) :
- 如果要携带 Cookie,不能使用
\*
,必须指定域名。 - 可使用
CorsFilter
或WebMvcConfigurer
配置。
- 如果要携带 Cookie,不能使用
- 高版本(≥2.4) :
allowedOriginPatterns("*")
支持通配符 + Cookie。- 推荐统一使用
WebMvcConfigurer
或CorsFilter
配置。
💡 小贴士:
- 在 2.4 之前版本前端请求时是否需要携带 Cookie,决定了是否可以使用
*
。maxAge
配置可以减少浏览器的预检请求次数,提高性能。