【发布时间】:2014-01-30 03:34:19
【问题描述】:
背景信息
我正在开发一个使用 GWT (v2.4) 的 Web 应用程序。对于该应用程序,我正在创建一个 iframe,它将显示来自另一个网站的一些信息。我需要从通常受同源策略 (SOP) 限制的 iframe 访问一些信息。但是,两个站点(父站点和 iframe)都托管在同一个超级域上,只是在不同的子域下。所以,是这样的:
- 父级:dev.app.mySite.com
- 框架:someOtherContent.mySite.com
我知道这个问题的通常解决方案是在父站点和 iframe 站点上设置属性:document.domain = 'mySite.com' 以允许通过 SOP。这适用于所有浏览器(我关心的),除了 Internet Explorer 8(可能还有其他版本)。
问题
在 IE 中,当我尝试加载我的 Web 应用程序时,我得到一个完全空白的页面,并出现以下 JS 异常“访问被拒绝”。这个问题的根源在 GWT 的 myGwtAppName.nochache.js 中,GWT 在编译过程中生成了一些它需要的代码(见下文)。
从我对这个问题的总体研究来看,这个问题的根本原因似乎是在 IE 中,与所有其他浏览器不同,iframe 不继承其父文档。域设置。据我了解,GWT 生成的代码在 iframe 中运行(基于此评论:https://stackoverflow.com/a/5161888)。因此,基于我对 JS 的有限知识,我认为正在发生的事情:
- 我通过JS在父索引页面中设置了document.domain = 'mySite.com'并进行了处理。
- myGwtAppName.nochache.js 已处理。
- 在 nochache.js 中,运行代码来设置 GWT iframe 沙盒环境
- 在该代码中,正在调用沙盒 iframe 的 SOP 受限属性
- 由于站点的父文档域已设置为“mySite.com”并且 iframe 的 document.domain 没有继承该设置,因此引发了异常,因此它仍然是“dev.app.mySite.com”。这不会通过 SOP,因为域必须完全相同。
导致异常的生成代码
下面的代码,看起来像是在设置 GWT 沙箱 iframe 环境。
var $intern_4 = 'myGwtAppName',
$intern_7 = 'body',
$intern_8 = 'iframe',
$intern_9 = 'javascript:""',
$intern_10 = 'position:absolute; width:0; height:0; border:none; left: -1000px; top: -1000px; !important',
$intern_11 = '<html><head><\/head><body><\/body><\/html>',
$intern_12 = 'script',
$intern_13 = 'javascript',
$intern_14 = 'var $wnd = window.parent;''
....
....
function setupInstallLocation(){
if (frameDoc) {
return;
}
var scriptFrame = $doc.createElement($intern_8);
scriptFrame.src = $intern_9;
scriptFrame.id = $intern_4;
scriptFrame.style.cssText = $intern_10;
scriptFrame.tabIndex = -1;
$doc.body.appendChild(scriptFrame);
frameDoc = scriptFrame.contentDocument;
if (!frameDoc) {
frameDoc = scriptFrame.contentWindow.document; //THIS CAUSES THE EXCEPTION
}
frameDoc.open();
frameDoc.write($intern_11);
frameDoc.close();
var frameDocbody = frameDoc.getElementsByTagName($intern_7)[0];
var script = frameDoc.createElement($intern_12);
script.language = $intern_13;
var temp = $intern_14;
script.text = temp;
frameDocbody.appendChild(script);
}
....
....
我的问题
- 我对情况的分析是否完全离题?
- 有没有人看到这个问题的解决方案可以在 IE 的 GWT 环境中工作?
信息来源
IE 不继承 document.domain 设置:https://stackoverflow.com/a/1888711(以及许多其他线程)。
GWT 在 iframe 沙盒环境中运行:https://stackoverflow.com/a/5161888
【问题讨论】:
标签: javascript gwt iframe subdomain