为什么我的跨域帖子消息仅在传递"*"作为源参数时才有效?



我正在与2个本地域,localhostdomain1一起工作,使用来自两个域的iframe测试postMessaging系统。

我可以正确地识别各自的window元素(在两个域中),以便向其发送消息和接收回复。我的问题是,在我的postMessage(我正在发送消息的URL)中发送的第二个参数不被侦听器在各自的其他域上接受。只有当我声明发送方为"*"时,我的消息传递才能正常工作。

发送消息到外部域不起作用:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, window.location.href);

如此:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, "*");

对发送域的回复也是如此(使用window.top)。这行不通:

 window.top.postMessage({
  "baz": "bam"
}, window.location.href.split("?")[0]);

window.top.postMessage({
  "baz": "bam"
}, "*");

问题:
为什么会这样呢?我想我必须提供发送url作为第二个参数来启用身份验证。如果是,为什么我的事件没有触发?是我在localhost/domain1工作的原因吗?

谢谢你的帮助!

第二个程序是targetOrigin,这是一个安全限制,以防止您的消息被截获。它应该设置为消息被发送到的窗口域,而不是消息来自的窗口域。

下面是一个使用iframe设置第二个字段的示例,它从iframe中获取src值,并将其切割为协议+域+端口。这是设定目标原点所需要的。

var target = iframe.src.split('/').slice(0,3).join('/');
iframe.contentWindow.postMessage('foo', target);

相关内容

  • 没有找到相关文章

最新更新