代码改变世界

你可能不知道的跨域解决方案

  Justany_WhiteSnow  阅读(2237)  评论(2编辑  收藏  举报

出于浏览器的同源策略,我们经常会遇到浏览器跨域的问题。

简单的说跨域基本解决方案是:

  • GET请求用JSONP
  • 其他请求用同源iframe做代理

JSONP的介绍很多,这里就不多说了。

而同源iframe做代理主要是主窗口与iframe的通讯问题,因为这里也有同源策略。常见的方法是使用window.name或者通过url param来通讯。但这些方法都需要反复加载iframe来完成的,资源消耗较高,有没有更好的方案呢?

 

window.postMessage

window.postMessage最早由IE8引入,主要为了解决跨文档通讯问题,以下使其支持列表:

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support 1.0 6.0 (6.0) [1] [4] 8.0 [2] [3] 9.5 4.0
transfer argument ? 20.0 (20.0) Not supported ? ?
otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow:目标窗口,是 window.frames 属性的成员或者由 window.open 方法创建的窗口

  • message: 要发送的消息,类型为 String、Object (IE8、9 不支持)
  • targetOrigin: 限定消息接收范围,不限制请使用 ‘*’

 

message事件

再通过绑定该窗口的message事件,来获取信息,例如:

window.addEventListener('message', function (event) {
  console.log(event.data);
}, false);

 

跨非同源文档通讯

这给我们提供了一种跨非同源文档通讯方案。这里有一个简单的例子:

http://html5demos.com/postmessage2

 

方案基本原理

基本原理现在就比较清晰了,我们依然使用同源iframe做代理,但是主页面与iframe的通讯方式是利用postMessage实现的。

 

现成方案

如果你已经只为IE8以上浏览器用户服务了(国外项目基本已经将IE6、7淘汰了),而且你不想处理这些兼容性问题,那么你可以选用下面老外实现的现成方案:

https://github.com/jpillora/xdomain

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示