BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

CrossFrame:为Mashup准备的安全的器件间跨域通信

| 作者 Gavin Terrill 关注 1 他的粉丝 ,译者 Frank Cheung 关注 0 他的粉丝 发布于 2007年11月30日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

来自Yahoo!的DHTML传道团队的Julien Lecomte,宣布发布“CrossFrame,一种安全的跨文档和跨域的通信机制”。按照Julien的说法,这种“Hack”的手段,能让同一页面上来自不同域的IFrames互相通讯。传统上出于安全方面的考虑,不同域上资源的通讯比较困难,这就是浏览器上所谓的“同源策略(Same Origin Policy)”。CrossFrame以URL片段标识符(URL fragment identifier)作为构建的基础,着手解决了两方面重要的问题:

  • 接受者必须进行轮询,导致无谓的CPU开销。
  • 在Safari和Opera上产生“伪”历史记录。

CrossFrame让跨域的各站点都共享宿主页面上使用的变量。流程主要分两步:

为了能够与在Y域上运行的Mashup通信,位于X域的页面动态创建一个隐藏的IFrame并指向位于Y域的一个特殊的代理文件,并利用URL片段标识符来运送消息。(第一步)当这个位于隐藏IFrame的特殊代理文件加载完毕后,就读取它的URL片段标识符,并将之传递给容纳了Mashup的IFrame内的一段全局函数,(第二步)使用parent.frames['mashup']就可获取到所需对象。

使用CrossFrame非常简单,安装一个代理文件,导入所需的JavaScript库文件,就可以通过JavaScript代码开始发送与接收:

登记onMessage事件以接收信息:

YAHOO.util.CrossFrame.onMessageEvent.subscribe(
    function (type, args, obj) {
        var message = args[0];
        var domain = args[1];
       //以下处理接收到的信息
    }
);

要发送信息,调用YAHOO.util.CrossFrame.send():

YAHOO.util.CrossFrame.send("http://www.y.com/proxy.html",
                           "frames['mashup']",
                           "message");

相关的演示已经准备好,可从中了解一下它在浏览器运作的实际情形。

Facebook在他们的Beacon工具中亦使用IFrames的思路来实现通讯。在Jay Goldman的一篇《Deconstructing Facebook Beacon Javascript》博文中,他把这种方法形容为:

对现代浏览器的跨域脚本安全特性的一种漂亮的规避。

在文章的结尾,Julien也告诫了使用CrossFrame带来的危害:

这种Hack手法会带来危险。首先,浏览器的厂商可能会更改它们的安全策略,比如改成像Opera那样的行为。
他接着说
而且,我不推荐使用Hack因为它们会减缓Web的革新速度。
最后结论

因此,虽然看起来有点矛盾,我不推荐使用CrossFrame(或者任何其他不堪的hack手段)。

令人遗憾,时下谈到合乎规范的页面内器件通信技术,开发者的选择并不多。虽然已经在拟订相关的草案来解决这个问题,但是距离浏览器的标准化实现还需一段时间。与此同时,如果有些事情非要在现在的浏览器上就做到,那么CrossFrame Hack也不失为一种可行的方案。

查看英文原文:CrossFrame - Safe, Cross Domain Widget Coordination for Mashups
译者简介:Frank Cheung有多年Web前端开发经验,动态语言爱好者。负责EXT中文站(www.ajaxjs.com)JavaScript开源论坛Js堂(jstang.5d6d.com)的维护工作。专注Ajax和WebUI,从YUI-Ext起,翻译了不少EXT相关的资料。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT