什么是跨域问题?
在前端开发中,跨域(Cross-Origin)指的是浏览器出于安全考虑,限制不同源之间的数据交互。所谓同源,需要满足三个条件:
- 协议相同(http / https)
- 域名相同
- 端口相同
只要有一个不同,就属于跨域请求。这个限制来自浏览器的核心安全机制——同源策略(Same-Origin Policy)。
为什么会出现跨域?
随着前后端分离架构的普及,前端和后端通常部署在不同域名或端口:
- 前端:http://localhost:3000
- 后端:http://api.xxx.com
此时浏览器会拦截请求,并报错:
Access to fetch at 'xxx' has been blocked by CORS policy
本质原因:浏览器不允许跨源读取数据。
前端跨域的核心解决思路
解决跨域问题,本质上有两种方式:
- 让浏览器允许跨域,典型方案:CORS
- 绕过浏览器限制,典型方案:代理、JSONP、WebSocket
主流跨域解决方案(2026最新)
1. CORS(推荐首选)
CORS(跨源资源共享)是目前最主流、最标准的解决方案。核心原理是服务器通过响应头告诉浏览器允许跨域。服务端在响应Header加入以下信息:
Access-Control-Allow-Origin: https://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type
优点:
- 官方标准方案
- 支持所有请求类型(GET/POST/PUT等)
- 安全性高
缺点:
- 需要后端配合
适用场景:企业项目 / 正式环境(首选)。
2. 代理服务器(最实用)
通过中间服务器转发请求,让前端看起来是同源。
原理:前端 → 本地代理 → 目标服务器。
- Vue:devServer.proxy
- React:setupProxy.js
- Nginx反向代理
- Node中间层
优点:
- 前端可独立解决
- 无需后端修改
- 生产环境也可用(Nginx)
缺点:增加一层服务
适用场景:开发环境 / 无法修改后端接口时。
3. JSONP(已逐渐淘汰)
利用 <script> 标签不受同源限制的特性实现跨域。
原理:
<script src="http://api.xxx.com/data?callback=fn"></script>
服务器返回:
fn({ data: "xxx" })
优点:
- 兼容老浏览器
- 实现简单
缺点:
- 只支持 GET 请求
- 安全性较低(易被攻击)
适用场景:老项目 / 特殊兼容需求。
4. postMessage(跨页面通信)
用于不同窗口或 iframe 之间通信。
window.postMessage(data, "https://target.com");
特点:
- 安全可控
- 适合 iframe 场景
适用场景:iframe嵌套页面通信。
5. WebSocket(实时通信)
WebSocket 不受同源策略限制,可实现跨域通信。
特点:
- 双向通信
- 实时性强
适用场景:聊天系统 / 实时数据。
2026最佳实践推荐
结合当前主流技术架构,推荐如下:
优先级排序
- CORS(标准方案)
- 代理(开发/无法改后端)
- WebSocket(实时需求)
- postMessage(iframe通信)
- JSONP(已不推荐)
总结
跨域问题本质是浏览器安全机制导致的限制,解决思路可以总结为一句话:要么让服务器允许(CORS),要么绕过浏览器(代理)。
在2026年的前端开发中:
- 企业项目:优先使用 CORS
- 开发调试:使用 代理
- 特殊场景:考虑 WebSocket / postMessage
掌握这几种方案,基本可以应对 99% 的跨域问题。