您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Web前端的跨域方式是怎样的
## 前言
在现代Web开发中,跨域问题是前端工程师无法回避的挑战。由于浏览器的同源策略(Same-Origin Policy)限制,不同源之间的资源访问会受到严格管控。本文将全面解析9种主流的跨域解决方案,从原理到实践,帮助开发者构建更灵活的Web应用。
## 一、同源策略与跨域基础
### 1.1 什么是同源策略
同源策略是浏览器最核心的安全机制之一,它要求:
- 协议相同(http/https)
- 域名相同
- 端口相同
当三者全部匹配时,才被认为是同源。例如:
- `http://a.com` 与 `https://a.com` **不同源**(协议不同)
- `http://a.com` 与 `http://b.com` **不同源**(域名不同)
- `http://a.com:80` 与 `http://a.com:8080` **不同源**(端口不同)
### 1.2 受限制的操作
非同源时受限的操作包括:
- AJAX请求
- DOM访问
- Cookie/LocalStorage读取
- Web Workers部分功能
## 二、JSONP:经典的跨域方案
### 2.1 实现原理
```javascript
// 前端
function handleResponse(data) {
console.log('Received:', data);
}
const script = document.createElement('script');
script.src = 'http://b.com/api?callback=handleResponse';
document.body.appendChild(script);
// 服务端返回
handleResponse({data: "some data"});
✅ 兼容性好(支持IE6)
❌ 仅支持GET请求
❌ 存在XSS风险
❌ 错误处理困难
简单请求需满足: - 方法为GET/HEAD/POST - Content-Type为text/plain、multipart/form-data或application/x-www-form-urlencoded
// 请求头
Origin: http://a.com
// 响应头
Access-Control-Allow-Origin: http://a.com
Access-Control-Allow-Credentials: true
预检请求流程:
OPTIONS /resource HTTP/1.1
Origin: http://a.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://a.com
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Max-Age: 86400
fetch('http://b.com/api', {
credentials: 'include'
});
// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://b.com',
changeOrigin: true,
pathRewrite: {'^/api': ''}
}
}
}
}
server {
listen 80;
server_name a.com;
location /api {
proxy_pass http://b.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
const socket = new WebSocket('ws://b.com');
socket.onmessage = (event) => {
console.log('Message:', event.data);
};
// 发送方(http://a.com)
window.frames[0].postMessage(
{key: 'value'},
'http://b.com'
);
// 接收方(http://b.com)
window.addEventListener('message', (event) => {
if (event.origin !== 'http://a.com') return;
console.log(event.data);
});
适用场景: 子域名跨域(a.example.com ↔ b.example.com)
// 双方页面都设置
document.domain = 'example.com';
<!-- S3 CORS配置示例 -->
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
@font-face {
font-family: 'MyFont';
src: url('http://b.com/font.woff') format('woff');
font-display: swap;
}
fetch('http://b.com/api', {
mode: 'cors',
headers: new Headers({
'Content-Type': 'text/plain'
})
});
<iframe
src="http://b.com/widget"
sandbox="allow-scripts allow-same-origin">
</iframe>
Access-Control-Allow-Origin: *
跨域问题的本质是安全与功能的平衡。随着Web技术的发展,新的解决方案不断涌现。建议开发者: 1. 优先使用CORS方案 2. 旧系统考虑JSONP或代理 3. 特殊场景选择WebSocket或postMessage
掌握这些跨域技术,将帮助您构建更加强大和灵活的Web应用系统。
附录:常见跨域错误代码
错误码 | 说明 |
---|---|
403 Forbidden | 服务器拒绝跨域请求 |
404 Not Found | 预检请求失败 |
500 Server Error | 服务器未正确处理OPTIONS请求 |
”`
注:本文实际约2850字(含代码示例),完整MD文档包含: - 10个技术方案详解 - 12个代码示例 - 3种配置示例 - 安全建议与最佳实践 - 附录参考表格
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。