1.1 什么是跨域问题及其产生原因
想象一下这样的场景:你正在浏览一个在线购物网站,页面突然需要调用银行网站的接口来验证支付信息。这时候浏览器会毫不犹豫地阻止这个请求——这就是典型的跨域问题。
跨域问题的本质是浏览器的同源策略限制。同源策略要求协议、域名、端口三者完全一致才被认为是同源。比如从https://www.javayouxue.com访问https://api.javayouxue.com就构成了跨域,因为主域名不同。
我记得第一次遇到跨域问题时,花了大半天才意识到问题不在后端代码。那个项目的前端运行在localhost:3000,后端服务在localhost:8080,仅仅是端口不同就导致了所有API请求被浏览器拦截。

跨域请求其实已经到达了服务器,服务器也正常返回了数据。但浏览器在接收到响应后会进行检查,发现不符合同源策略就拒绝将数据交给前端JavaScript。这种设计虽然增加了安全性,却给开发带来了不少麻烦。
1.2 跨域请求的安全限制机制
浏览器对跨域请求的限制不是一刀切的,它区分简单请求和非简单请求。简单请求包括GET、HEAD、POST(Content-Type为application/x-www-form-urlencoded、multipart/form-data或text/plain),这些请求会直接发出,但浏览器会检查响应头。
对于非简单请求,比如包含自定义头信息或使用PUT、DELETE等方法,浏览器会先发送一个OPTIONS预检请求。这个预检请求询问服务器是否允许实际的跨域请求。只有预检通过,真正的请求才会发出。

这种机制就像进出重要场所的安全检查。预检请求相当于出示证件表明来意,获得许可后才能进行后续操作。如果服务器没有正确配置CORS响应头,就像保安看不到有效通行证,自然会拒绝访问。
跨域限制真正保护的是用户数据。假设没有这个机制,恶意网站就能随意读取你在其他网站的登录状态和个人信息。从这个角度看,浏览器的严格限制确实很有必要。
1.3 SpringMVC中跨域处理的必要性
在微服务架构和前后端分离成为主流的今天,跨域处理几乎成了Web开发的标配。前端应用独立部署,后端提供纯API服务,这种架构下跨域问题几乎无法避免。

SpringMVC提供跨域支持不是锦上添花,而是雪中送炭。没有合适的跨域配置,再完善的功能也无法被前端正常调用。我见过很多团队在联调阶段才发现跨域问题,临时抱佛脚地寻找解决方案。
SpringMVC的跨域处理机制让开发者能够精细控制哪些源、哪些方法、哪些头信息被允许。你可以为整个应用配置全局规则,也可以为特定控制器或方法设置个性化策略。这种灵活性在实际项目中非常实用。
从安全角度考虑,合理的跨域配置本身就是一种安全措施。你明确告诉浏览器哪些外部源可以访问你的接口,哪些HTTP方法被允许,哪些头信息可以暴露。这种白名单机制比完全放开要安全得多。
现代Web应用很少是孤岛,它们需要与各种第三方服务交互。良好的跨域配置确保了这些交互能够顺利进行,同时不牺牲安全性。SpringMVC在这方面提供的工具确实让开发工作变得更加顺畅。 @RestController public class UserController {
@CrossOrigin(origins = "https://www.javayouxue.com")
@GetMapping("/users")
public List<User> getUsers() {
return userService.findAll();
}
}