Java Spring MVC 怎么通过配置 CORS 解决前后端分离项目的跨域访问

冰川箭仙

冰川箭仙

2026-07-30

688人浏览

原创

spring mvc解决跨域的核心是后端通过响应头明确声明允许的源、方法、请求头及凭证策略;主流配置方式有三种:全局配置(webmvcconfigurer)、控制器粒度配置(@crossorigin注解)和xml/filter手动配置,其中全局配置最常用且推荐,需注意allowcredentials与allowedorigins冲突、预检请求处理及spring security对options的拦截等关键坑点。

java spring mvc 怎么通过配置 cors 解决前后端分离项目的跨域访问

Spring MVC 解决前后端分离项目的跨域访问,核心是让后端明确告诉浏览器:“哪些前端域名可以访问我,允许带什么头、什么方法、是否传 Cookie”。配置方式有三种主流路径,按推荐度和适用场景区分,不复杂但容易忽略关键细节。

全局配置:用 WebMvcConfigurer 统一管理(最常用)

适合绝大多数前后端分离项目,集中控制、逻辑清晰、便于维护。

  • 创建配置类实现 WebMvcConfigurer 接口,重写 addCorsMappings 方法
  • 路径匹配建议用 /api/**/**,避免过度开放(如只开放接口路径,不开放静态资源)
  • allowedOrigins 生产环境必须写具体域名,比如 ["https://admin.example.com", "https://app.example.com"];开发阶段可用 allowedOriginPatterns 配合通配符,如 "http://localhost:*"
  • 若前端需携带 Cookie 或 Token(如 JWT 存于 Cookie),allowCredentials 必须设为 true,且此时 allowedOrigins 不能用 *,否则浏览器会拒绝
  • allowedHeaders 建议明确列出,如 "Content-Type, Authorization, X-Requested-With";设为 "*" 在部分旧浏览器或严格模式下可能被忽略

控制器粒度配置:用 @CrossOrigin 注解(最灵活)

适合局部放开跨域,比如某个接口要对接第三方系统,或测试阶段快速验证。

Java Linux版
Java Linux版

Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。

下载
  • 加在 Controller 类上,作用于全部接口;加在具体方法上,只对该接口生效
  • 支持细粒度控制:可单独指定 originsmethodsmaxAgeallowCredentials
  • 例如:@CrossOrigin(origins = "https://test-site.com", allowCredentials = "true")
  • 注意:若同时存在全局配置和注解配置,注解配置优先级更高,会覆盖全局规则

XML 配置或 Filter 手动设置(兼容老项目)

适用于 Spring MVC 传统 XML 配置项目,或需要完全自定义响应头的特殊场景(如动态 Origin 判断)。

  • XML 方式(Spring 4.2+):在 spring-mvc.xml 中使用 <cors></cors> 标签,结构清晰但灵活性低
  • Filter 方式:自定义 Filter,在 doFilter 中手动设置响应头,如 response.setHeader("Access-Control-Allow-Origin", origin)
  • Filter 的优势是可以读取请求头动态决定 Origin(比如从请求参数或数据库查白名单),但需自行处理预检请求(OPTIONS)返回 200,否则复杂请求会失败
  • 缺点是绕过了 Spring 的 CORS 管理机制,无法享受自动预检响应、异常统一处理等特性

必须注意的几个坑

很多跨域问题不是没配,而是配得“差不多但差一点”:

  • Credentials 和 Origin 冲突:设置了 allowCredentials=true 却还用 allowedOrigins=["*"],浏览器直接报错
  • 预检失败静默无提示:非简单请求(如带自定义 header 或 Content-Type: application/json)会先发 OPTIONS 请求;若后端没正确响应 200 + 对应头,前端只显示 “Network Error” 或 “CORS error”,看不到真实原因
  • 多个配置叠加失效:比如同时用了全局配置 + @CrossOrigin + Filter,容易互相覆盖或重复添加头,导致响应头冲突(如两个 Access-Control-Allow-Origin)
  • Spring Security 默认拦截 OPTIONS:如果项目集成了 Spring Security,它可能把预检请求当成未认证请求拦掉,需显式放行:http.authorizeHttpRequests(auth -> auth.requestMatchers(HttpMethod.OPTIONS, "/api/**").permitAll())

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2131

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2653

10

java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3863

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2838

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2875

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

637

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

706

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习