1. 跨域问题与CORS基础解析
在前后端分离架构成为主流的今天,跨域问题已经成为每个Java开发者必须面对的挑战。作为一名长期奋战在一线的Java开发者,我处理过各种复杂的跨域场景,今天就来系统梳理Spring Security环境下的跨域解决方案。
1.1 为什么会有跨域限制
浏览器出于安全考虑,实施了同源策略(Same-Origin Policy)。这个策略要求:只有当协议、域名和端口都相同时,才允许脚本访问资源。比如:
http://a.com访问http://a.com/api→ 同源https://a.com访问http://a.com→ 不同源(协议不同)http://a.com:8080访问http://a.com:8090→ 不同源(端口不同)
实际开发中,前端开发服务器通常运行在
localhost:3000,而后端API运行在localhost:8080,这就构成了典型的跨域场景。
1.2 CORS工作机制详解
CORS通过新增一组HTTP头部字段来实现跨域控制,其核心流程分为两种:
1.2.1 简单请求处理流程
简单请求需满足以下条件:
- 方法为GET、HEAD或POST
- Content-Type为
text/plain、multipart/form-data或application/x-www-form-urlencoded - 没有自定义头部
浏览器直接发送带Origin头的请求:
http复制GET /api/data HTTP/1.1
Origin: http://localhost:3000
服务器响应包含:
http复制Access-Control-Allow-Origin: http://localhost:3000
1.2.2 预检请求处理流程
对于非简单请求(如PUT、DELETE或带自定义头部的请求),浏览器会先发送OPTIONS预检请求:
http复制OPTIONS /api/data HTTP/1.1
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: custom-header
Origin: http://localhost:3000
服务器需响应:
http复制HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: custom-header
Access-Control-Max-Age: 3600
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring中的跨域解决方案
2.1 @CrossOrigin注解方式
这是最细粒度的控制方式,适合特定接口的跨域配置:
java复制@RestController
@RequestMapping("/api")
public class DataController {
@CrossOrigin(
origins = "http://localhost:3000",
methods = {RequestMethod.GET, RequestMethod.POST},
allowedHeaders = "*",
max
