概念:
跨域本质上是由于浏览器的同源策略(Same-Origin Policy)这一安全机制所引起的。
同源策略规定,只有在协议、域名、端口这三要素完全一致的情况下,不同网页的脚本才能相互访问资源,否则就会发生跨域问题。这里的“资源”包括但不限于:JavaScript代码、网络请求(如AJAX)等。
跨域问题可以用一个「外卖配送」的比喻来理解:
📦 情景设定:
假设你住在北京朝阳区,点了一家海淀区的餐厅外卖。当海淀区的骑手到朝阳区送餐时,会被小区保安拦住说:
"抱歉,我们只允许本区骑手进入!"
这就是典型的跨域请求被浏览器拦截的现象。
💻 技术映射到现实:
- 浏览器:像严格的保安系统
- 同源策略:小区规则(只允许同区域的请求)
- 跨域请求:海淀区骑手要给朝阳区送餐
- CORS:海淀区餐厅提前向朝阳区申请的"跨区通行证"
🛠️ 实际代码案例:
假设你的网站域名是 www.chaoyang.com
,想要调用 www.haidian.com/api
的数据接口:
// 前端代码(www.chaoyang.com)
fetch('https://www.haidian.com/api/menu')
.then(response => response.json())
.then(data => console.log(data))
这时浏览器会报错:
Access to fetch at 'https://www.haidian.com/api/menu'
from origin 'https://www.chaoyang.com' has been blocked by CORS policy
🔑 解决方案(颁发通行证):
海淀区服务器需要主动声明允许朝阳区访问:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.chaoyang.com // 关键响应头
Content-Type: application/json
{"menu": ["宫保鸡丁", "鱼香肉丝"]}
🔍 完整流程解析:
- 骑手出发:浏览器发送请求
- 保安检查:浏览器发现跨域请求
- 验证通行证:检查响应头是否包含
Access-Control-Allow-Origin
- 放行条件:
- 精确匹配:
Access-Control-Allow-Origin: https://www.chaoyang.com
- 通配符:
Access-Control-Allow-Origin: *
(允许所有区域)
- 精确匹配:
🛡️ 其他解决方案:
-
JSONP:通过
<script>
标签绕过限制(像让骑手伪装成快递员)<script src="https://www.haidian.com/api/menu?callback=handleData"></script>
-
代理服务器:先让朝阳区自己的服务器代取数据(相当于派本区骑手去海淀取餐)
⚠️ 为什么需要跨域限制?
如果允许任意跨域访问,就像允许:
- 陌生人随意进入你家小区
- 钓鱼网站随意读取你的银行Cookie
- 恶意网站窃取企业内网数据
通过这个外卖配送的类比,应该能直观理解为什么需要跨域限制,以及如何通过CORS机制安全地实现跨域访问。