Uncaught SecurityError:阻止具有原点的帧...访问具有原点的帧

时间:2015-02-02 18:57:34

标签: javascript security iframe same-origin-policy

我已经为通过iframe嵌入到报表中的SAP解决方案(无论如何)制作了一个组件。在SAP平台(BO)上部署报告后,我收到了此错误(在Chrome上,但在IE或FF上也不起作用):

Uncaught SecurityError: Blocked a frame with origin "http://support.domain.com" from accessing a frame with origin "http://support.domain.com". The frame requesting access set "document.domain" to "domain.com", but the frame being accessed did not. Both must set "document.domain" to the same value to allow access.

iframe已嵌入到我的组件中,因此它假设在与报告相同的端口上运行。

我在SO和post上找到了这个one,但它并没有真正帮助我理解我需要做什么。

有没有办法摆脱这种情况,或至少解决这个问题? 谢谢:)。

编辑:

主页网址:http://support.domain.com/BOE/OpenDocument/opendoc/openDocument.jsp?sIDType=CUID&iDocID=AbmffWLjCAlFsLj14TjuDWg

调用iframe上的属性并生成错误的文件的网址:http://support.domain.com/BOE/OpenDocument/1411281523/zenwebclient/zen/mimes/sdk_include/com.domain.ds.extension/res/cmp/js/component.js

框架的网址: http://support.domain.com/BOE/OpenDocument/1411281523/zenwebclient/zen/mimes/sdk_include/com.domain.ds.extension/res/cmp/js/map/js/map.html

iframe嵌入了一些脚本标记,我可以在控制台的网络标记中看到所有内容都正常加载。

也许它可以提供帮助。

编辑2:

我刚刚意识到SAP报告本身已嵌入到iframe中。这意味着我的iframe在iframe中,这可能是问题所在。但是,当从Eclipse推出报告时,一切正常。

1 个答案:

答案 0 :(得分:6)

我终于找到了解决方案。

我的iframe顶部的 domain.location 设置为domain.com,我的iframe domain.location 设置为support.domain.com。< / p>

事件虽然我仍然认为两者都属于同一个域,但浏览器似乎并不喜欢它。

重新设置 domain.location 完成了工作。

要回答有关如何重新设置location.domain的问题,请参阅我的团队过去常用的代码片段。这是相当古老的(2年前),没有真正优化,我们不再使用它,但我想这值得分享。 基本上,我们正在做的是加载iframe并在URL参数中传递顶级域名。

var topDomain = (function handleDomain(parameters) {
        if (typeof parameters === "undefined") {
            return;
        }
        parameters = parameters.split("&");
        var parameter  = [],
            domain;
        for (var i = 0; i<parameters.length; ++i) {
            parameter.push(parameters[i]);
        }
        for (var j = 0; j<parameter.length; ++j) {
            if (parameter[j].indexOf("domain") > -1) {
                domain = parameter[j];
                break;
            }
        }
        if (typeof domain !== "undefined") {
            domain = domain.split("=");
            return domain[1];
        }
        return; 
    })(window.location.search),
    domain = document.domain;

if (domain.indexOf(topDomain) > -1 && domain !== topDomain) {
    document.domain = topDomain;
}