14_Spring Boot 跨域(CORS)处理指南

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,不能使用 \*,必须指定域名。
    • 可使用 CorsFilterWebMvcConfigurer 配置。
  • 高版本(≥2.4)
    • allowedOriginPatterns("*") 支持通配符 + Cookie。
    • 推荐统一使用 WebMvcConfigurerCorsFilter 配置。

💡 小贴士:

  • 在 2.4 之前版本前端请求时是否需要携带 Cookie,决定了是否可以使用 *
  • maxAge 配置可以减少浏览器的预检请求次数,提高性能。
相关推荐
全栈老石2 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
space62123273 小时前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
Tony Bai3 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
寻找奶酪的mouse4 小时前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大4 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
金牌归来发现妻女流落街头4 小时前
【从SpringBoot到SpringCloud】
java·spring boot·spring cloud
毅炼4 小时前
Java 基础常见问题总结(4)
java·后端
皮卡丘不断更4 小时前
手搓本地 RAG:我用 Python 和 Spring Boot 给 AI 装上了“实时代码监控”
人工智能·spring boot·python·ai编程
想用offer打牌4 小时前
MCP (Model Context Protocol) 技术理解 - 第一篇
后端·aigc·mcp
千寻girling4 小时前
Koa.js 教程 | 一份不可多得的 Node.js 的 Web 框架 Koa.js 教程
前端·后端·面试