Cross-Origin PostMessage方法失败

时间:2013-12-27 16:31:25

标签: javascript asp.net-mvc http cross-domain

我看了很多,发现了很多修复和文档,但是我发布了这个,因为它们都没有为我工作。

我正在开发2个MVC4站点。 SSO(即HTTPS)和视频(HTTP) (现在都是当地主持人)

视频加载一个页面,其中IFRAME指向SSO上的页面。它正确加载页面。

SSO页面有这个javascript:

window.onmessage = function (e) {
    if (e.data == 'hello') {
        alert('It works!');
    }
};

视频页面包含以下代码:

<iframe frameborder="0" width="100px" height="100px" id="LbpSsoFrame" src="https://localhost:44301/Sso/InFrame"></iframe>

加载页面后,我使用chrome的控制台(Chrome V32.0.1700.41 m Aura)并调用以下代码行:

LbpSsoFrame.contentWindow.postMessage('hello', '*');

我收到此错误:

code: 18
message: "Blocked a frame with origin "http://localhost:46086" from accessing a cross-origin frame."
name: "SecurityError"
stack: "Error: Blocked a frame with origin "http://localhost:46086" from accessing a cross-origin frame.↵    at <anonymous>:2:12↵    at Object.InjectedScript._evaluateOn (<anonymous>:603:39)↵    at Object.InjectedScript._evaluateAndWrap (<anonymous>:562:52)↵    at Object.InjectedScript.evaluate (<anonymous>:481:21)"

我站在一堵砖墙前,希望别人知道我做错了什么或者还有什么需要做。感谢。

1 个答案:

答案 0 :(得分:1)

雅虎,我发现了这个问题:我不应该将LbpSsoFrame称为对象。我不知道为什么会这样。

这是有效的代码:

document.getElementById('LbpSsoFrame').contentWindow.postMessage('hello', '*');

这就是我所拥有的:

LbpSsoFrame.contentWindow.postMessage('hello', '*');

修复该行后,我收到消息。

我原以为

document.getElementById('LbpSsoFrame')

LbpSsoFrame

是不同的方式来调用相同的东西。任何人都可以向我解释有什么区别?两者都可以调用post消息,但是在直接使用对象时会收到HTTPS / HTTP警告或其他警告。

它现在有效,但我仍然有点失落原因。