Skip to content

关于跨域的那些事

约 1078 字大约 4 分钟

跨域代理

2025-06-24

跨域的原理

什么是跨域?

跨域

跨域指的是当一个网页的 JavaScript 脚本请求另一个域的资源时,浏览器出于安全考虑而阻止这种行为。这种情况通常会发生在以下情况下:

  • 协议不同,例如 HTTP 和 HTTPS
  • 域名不同,例如 example.comexample.net
  • 端口不同,例如 example.com:80example.com:3000

同源策略

定义

同源策略是浏览器的一项安全机制,旨在防止恶意脚本窃取用户信息。具体来说,同源意味着协议、主机和端口必须完全相同。任何不同之处都会导致浏览器将请求视为跨域请求。

跨域的解决方案

1. JSONP

JSONP(JSON with Padding)是最早的一种解决跨域请求的方法,它利用了 <script> 标签的跨域特性。通过动态创建一个 <script> 标签,将 src 设置为跨域的接口地址,并在请求中传递一个回调函数的名称,服务器会返回一个调用该函数的 JavaScript 代码。这样可以实现跨域的数据获取。

优缺点:

  • 优点:易于使用,兼容旧版浏览器。
  • 缺点:
    • 仅支持 GET 请求。
    • 需要后端配合返回特定格式的数据。

2. CORS(跨域资源共享)

CORS 是现代浏览器支持的一种机制,它允许服务器在响应中设置跨域请求的允许条件。服务器通过设置 Access-Control-Allow-Origin 响应头,声明允许哪些域进行跨域请求。

优缺点:

  • 优点:支持多种 HTTP 方法(如 POSTPUTDELETE)。
  • 缺点:相对复杂,需要后端和前端的合作。

3. 代理服务器

在开发过程中,使用代理服务器是一种常见的解决方案。代理可以通过设置相应的网络配置,允许前端开发环境与后端接口之间进行有效通信。例如,在 webpack 的开发服务器中,可以配置 proxy 选项,将请求转发到后端服务器。生产环境中,使用 nginx 等反向代理服务器同样可以轻松处理跨域请求。

4. window.postMessage()

window.postMessage() 是 HTML5 中新增的一个特性,允许不同源的窗口或 iframe 之间进行安全的消息传递。这提供了一种灵活的方法来处理复杂的跨域交互。

5. document.domain

当子域名不同但基础域名相同时,可以通过 设置 document.domain 实现跨域数据共享。例如,将 document.domain 设置为 example.com 可以使所有子域之间共享。

6. window.name

利用 window.name 属性可以在不同域名间共享数据,因其在页面跳转时不受同源政策的限制。通过使用一个中转页面,可以将数据存储在 window.name 中,然后再从目标页面读取这些数据

跨域相关的存储机制

了解不同的客户端存储机制,如 CookiesessionStoragelocalStorage,有助于在跨域请求中保存用户状态。

  • 存储大小限制在 4KB 左右
  • 数据会随请求发送到服务器,适用于维护用户会话。
  • 可设置过期时间,支持持久存储

sessionStorage

  • 数据在浏览器窗口的会话期间存储,窗口关闭后自动删除
  • 存储容量通常为 5MB。
  • 只在同一标签页中可用,跨标签页则不可访问

localStorage

  • 用于 长期存储数据,数据不会随窗口或标签页关闭而消失。
  • 除非主动删除,数据可以无限期保持,通常容量为 5MB 以上

总结

跨域问题在 web 开发中是一个常见而重要的课题。合理理解和应用各种跨域解决方案,能够帮助开发者高效地进行前后端交互。同时,熟悉用户端的存储机制以及如何合理地利用这些机制,将为构建更加安全、流畅的网络应用奠定基础。