从iframe中的子域进行JavaScript跨域访问

JavaScript cross domain access from subdomain in iframe

本文关键字:JavaScript 访问 iframe      更新时间:2023-09-26

父页面位于site.com上。我在sub.site.com上有一个页面,它将通过iframe包含在父页面上。每https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy这应该可以通过让sub.site.com页面将其域更新到site.com来实现。但是,当我尝试此操作时,由于同源策略,我仍然会收到拒绝访问的错误。

site.com:

<html>
<head></head>
<body><iframe src="http://sub.site.com"/></body>
</html>

subsite.com:

<html>
<head>
<script>
    function setupPage() {
    try {
        var oldDomain="current iframe domain: ";
        oldDomain = oldDomain.concat(document.domain);
        alert(oldDomain);
        document.domain='sakai.rutgers.edu';
        var newDomain="new iframe domain: ";
        newDomain = newDomain.concat(document.domain);
        alert(newDomain);
        var parentDomain="parent domain: ";
        parentDomain = parentDomain.concat(parent.window.document.domain);
        alert(parentDomain);
    }
    catch (err) {
        var e = "Caught error: ";
        e = e.concat(err.message);
        alert(e);
    }
</script>
</head>
<body onload=setupPage()>
<p>Test Page</p>
</body>

当我加载父页面时,前两个警报显示域正在按预期重置。但是,当脚本尝试访问parent.window.document.domain时,会抛出以下错误(在Chrome中):"捕获错误:阻止了具有原点的帧"http://sub.site.com"访问跨原点帧。"

我错过了什么?

我认为在代码中您可能想要使用

parentDomain = parentDomain.concat(document.domain); 

而不是

parentDomain = parentDomain.concat(parent.window.document.domain);

在第一种情况下,我猜它对当前窗口可用,因此它将获得文本并将其连接。如果您需要访问父窗口,请使用类似的东西

parent.window.frames.documents............ 

希望能有所帮助。我自己不是大师,但我以前也遇到过这种情况,这种技术已经消除了问题。