首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同来源的窗口之间发送消息,而不引用该窗口

在不同来源的窗口之间发送消息,而不引用该窗口
EN

Stack Overflow用户
提问于 2016-04-10 21:57:26
回答 2查看 247关注 0票数 1

窗口A是任何网站。用户在这个窗口中运行一个书签,从我的域中下载一个脚本。窗口B在我的网站上,具有与脚本相同的域名。当用户运行书签时,从窗口A发送消息到窗口B的最佳方式是什么?

我能够通过使用window.postMessage与我域中的一个隐藏的iframe通信来实现这个工作,它使用本地存储api将消息转发到窗口B。然而,我想知道是否存在一个更简单的方法。

起作用的方法:窗口A -> postMessage ->隐藏在窗口A ->存储apis窗口B的域上

有没有一种没有隐藏的iframe或服务器端逻辑而直接从窗口A到窗口B的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-10 22:23:29

如果窗口之间没有连接,这意味着域A不是域B的iframe,反之亦然(并且您对两者都没有控制权),则必须使用服务器端逻辑。您使用的隐藏的iframe是一种方式,另一种方式是:

您可以定期或有意使用窗口A中的脚本调用站点B,如下所示:

代码语言:javascript
复制
var cookieScriptUrl = 'http://www.siteB.com/set_cookie.php?';
function sendData( data ) {
    var image = new Image();
    image.src = cookieScriptUrl + data;
};
sendData('likes=3');

你可以发送大量的数据,记住最大值在2Mb左右。

更进一步,在PHP脚本中设置cookie,而不是在窗口B中读取它们。

票数 0
EN

Stack Overflow用户

发布于 2016-04-10 22:29:16

使这种交流不可能是浏览器的工作。如果脚本能够不受限制地在域之间传递数据,则跨站点脚本攻击的风险很高。

除了浏览器之外,还允许有两种方式进行这样的交流:

  • postMessage与隐藏帧的对话
  • 带有所谓内容脚本的浏览器网络扩展可以监听一个页面上的更改,并通过chrome.runtime.sendMessage将它们传输到另一个页面(在火狐扩展中,您可以管理这一点,可能是更多的方式)。
  • 或者您也可以尝试:
    • WebRTC数据通道或web套接字以在打开的选项卡之间创建通信
    • SharedWorkers (它应该充当隐藏的iframe)

应该根据您的用例使用特定的技术。在某些情况下,后端或cookie的使用可能完全足够。

为了帮助自己尝试postMessage通信,我创建了一个名为Spanan https://github.com/chrmod/spanan的小库。它对Javascript代理的使用减少了消息传递的痛苦(不是一个实验,不是一个应该在生产中使用的严肃库)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36536007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档