我已经为通过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,但它并没有真正帮助我理解我需要做什么。
有没有办法摆脱这种情况,或至少解决这个问题? 谢谢:)。
编辑:
调用iframe上的属性并生成错误的文件的网址:http://support.domain.com/BOE/OpenDocument/1411281523/zenwebclient/zen/mimes/sdk_include/com.domain.ds.extension/res/cmp/js/component.js
iframe嵌入了一些脚本标记,我可以在控制台的网络标记中看到所有内容都正常加载。
也许它可以提供帮助。
编辑2:
我刚刚意识到SAP报告本身已嵌入到iframe中。这意味着我的iframe在iframe中,这可能是问题所在。但是,当从Eclipse推出报告时,一切正常。
答案 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;
}