Web前端的跨域方式是怎样的

发布时间:2021-11-10 10:37:59 作者:iii
来源:亿速云 阅读:169
# 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"});

2.2 优缺点分析

✅ 兼容性好(支持IE6)
❌ 仅支持GET请求
❌ 存在XSS风险
❌ 错误处理困难

三、CORS:现代跨域标准方案

3.1 简单请求与预检请求

简单请求需满足: - 方法为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

3.2 带凭证的请求

fetch('http://b.com/api', {
  credentials: 'include'
});

四、代理服务器方案

4.1 开发环境代理配置(webpack示例)

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://b.com',
        changeOrigin: true,
        pathRewrite: {'^/api': ''}
      }
    }
  }
}

4.2 Nginx反向代理配置

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;
  }
}

五、WebSocket跨域

const socket = new WebSocket('ws://b.com');
socket.onmessage = (event) => {
  console.log('Message:', event.data);
};

六、postMessage跨窗口通信

// 发送方(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);
});

七、document.domain降域

适用场景: 子域名跨域(a.example.com ↔ b.example.com)

// 双方页面都设置
document.domain = 'example.com';

八、跨域资源共享的进阶方案

8.1 使用CDN的CORS配置

<!-- S3 CORS配置示例 -->
<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
  </CORSRule>
</CORSConfiguration>

8.2 跨域字体加载

@font-face {
  font-family: 'MyFont';
  src: url('http://b.com/font.woff') format('woff');
  font-display: swap;
}

九、新兴的跨域技术

9.1 Fetch API的跨域控制

fetch('http://b.com/api', {
  mode: 'cors',
  headers: new Headers({
    'Content-Type': 'text/plain'
  })
});

9.2 Web Components的跨域隔离

<iframe 
  src="http://b.com/widget" 
  sandbox="allow-scripts allow-same-origin">
</iframe>

十、安全注意事项

  1. 严格设置CORS白名单:避免使用Access-Control-Allow-Origin: *
  2. CSRF防护:即使通过CORS也需防范CSRF攻击
  3. 敏感信息保护:避免在响应中暴露敏感数据

结语

跨域问题的本质是安全与功能的平衡。随着Web技术的发展,新的解决方案不断涌现。建议开发者: 1. 优先使用CORS方案 2. 旧系统考虑JSONP或代理 3. 特殊场景选择WebSocket或postMessage

掌握这些跨域技术,将帮助您构建更加强大和灵活的Web应用系统。


附录:常见跨域错误代码

错误码 说明
403 Forbidden 服务器拒绝跨域请求
404 Not Found 预检请求失败
500 Server Error 服务器未正确处理OPTIONS请求

”`

注:本文实际约2850字(含代码示例),完整MD文档包含: - 10个技术方案详解 - 12个代码示例 - 3种配置示例 - 安全建议与最佳实践 - 附录参考表格

推荐阅读:
  1. 什么是跨域
  2. PHP实现跨域的方式有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

web前端

上一篇:oracle 12cR2单实例如何安装

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》