java处理rest跨域问题需后端配置cors响应头,核心方式有三:@crossorigin注解(类或方法级,支持细粒度参数)、webmvcconfigurer全局路径匹配、自定义filter(兼容非spring项目),并须注意预检请求、凭证配置及spring security放行等避坑要点。

Java 中处理 REST 接口的跨域(CORS)问题,关键是让后端在 HTTP 响应中正确返回浏览器认可的跨域许可头。这不是前端能绕开的限制,而是浏览器强制执行的同源策略,必须由服务端明确授权。
用 @CrossOrigin 注解控制单个接口或控制器
这是最轻量、最精准的方式,适合只对部分接口开放跨域,或不同接口需要不同策略的场景。
- 加在 Controller 类上:整个类下所有方法都启用 CORS
- 加在具体方法上:仅该接口生效,可覆盖类级配置
- 支持细粒度参数,比如:@CrossOrigin(origins = "http://localhost:3000", methods = {RequestMethod.GET, RequestMethod.POST}, allowCredentials = "true")
- 开发阶段可临时设为 origins = "*",但生产环境禁用该写法(与 allowCredentials = "true" 冲突)
通过 WebMvcConfigurer 全局配置 API 路径规则
适用于前后端分离项目中大部分接口都需要统一跨域策略的情况,比如所有 /api/** 路径都允许指定前端域名访问。
- 创建配置类实现 WebMvcConfigurer,重写 addCorsMappings
- 用 registry.addMapping("/api/**") 指定路径模式
- 设置 allowedOrigins(建议写具体域名,如 "http://localhost:3000")、allowedMethods、allowCredentials(true) 等
- 若需支持多个域名,可用 allowedOriginPatterns 配合通配符,例如 "https://*.mycompany.com"
自定义 Filter 拦截并注入 CORS 头(通用性强)
不依赖 Spring 框架,适用于原生 Servlet、老项目或需要完全掌控响应头逻辑的场景。注意必须正确处理 OPTIONS 预检请求。
- 实现 javax.servlet.Filter,用 @Component 和 @Order(Ordered.HIGHEST_PRECEDENCE) 注册
- 对所有请求设置 Access-Control-Allow-Origin、Access-Control-Allow-Methods 等头
- 遇到 OPTIONS 方法时,直接返回 200 OK,不再走后续链路
- 避免同时设 Access-Control-Allow-Origin: * 和 Access-Control-Allow-Credentials: true,否则浏览器会拒绝
调试和避坑要点
CORS 问题常因配置细节出错而难以定位,重点检查这几项:
- 浏览器开发者工具的 Network 标签页里,看预检(OPTIONS)请求是否返回 200,响应头是否含 Access-Control-Allow-Origin
- 实际请求的响应头中,Access-Control-Allow-Origin 的值必须与请求头中的 Origin 完全匹配(协议、域名、端口)
- 开启凭证(Cookie / Authorization)时,前端 fetch 要加 credentials: 'include',后端必须指定具体域名,不能用通配符
- Spring Security 默认会拦截 OPTIONS 请求,需显式放行:http.authorizeHttpRequests(auth -> auth.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











