跨域请求(Cross-Origin Request)是前端开发中一个非常重要且常见的问题,它关系到浏览器安全机制、前后端通信策略、接口调用规范。
下面我来详细解释:
当浏览器中的网页访问一个与当前网页源(Origin)不同的地址时,就叫“跨域请求”。
页面地址 | 请求地址 | 是否跨域 | 原因 |
---|---|---|---|
http://example.com |
http://example.com |
❌ 否 | 完全相同 |
http://example.com |
https://example.com |
✅ 是 | 协议不同 |
http://example.com |
http://api.example.com |
✅ 是 | 子域名不同 |
http://example.com:80 |
http://example.com:8080 |
✅ 是 | 端口不同 |
来自 浏览器的同源策略(Same-Origin Policy)。
该策略限制 JavaScript 脚本只能访问与其网页同源的资源,以防止恶意脚本窃取用户信息(例如 Cookie、LocalStorage)。
⚠️ 注意:跨域问题主要发生在 浏览器发起的请求,如 AJAX、fetch、图片、iframe、脚本标签等。
Access-Control-Allow-Origin
等响应头,允许特定源跨域访问。Access-Control-Allow-Origin: https://frontend.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
fetch('https://api.example.com/data', {
credentials: 'include' // 允许发送 cookie
; })
<script>
标签加载带回调函数的 JSON
数据来实现跨域。<script src="https://api.example.com/data?callback=handleData"></script>
<script>
function handleData(data) {
console.log(data);
}</script>
/api/...
,由服务器再请求真实跨域地址,然后返回结果。// 前端访问
fetch('/api/user')
// nginx 配置反向代理
/api/ {
location https://target-domain.com/;
proxy_pass }
window.postMessage
进行跨域通信。api.example.com
你可以这样回答:
“跨域是浏览器出于安全限制而阻止前端 JS 访问不同源的资源。最主流的解决方式是 CORS,由服务端设置响应头允许特定源访问。开发中也常使用 代理转发、postMessage、或采用 JSONP 兼容旧系统。”