获取同一域中 url 的跨域框架异常,其中一个 url 通过第三方网站的回调打开

Getting cross-origin frame exception for urls in the same domain, one url opened through callback from a third party website

我正在尝试关闭此页面并使用代码刷新父页面:

window.opener.windowClosing();
self.close();

我收到这个错误:

Uncaught DOMException: Blocked a frame with origin "aaa.bbb.com" from accessing a cross-origin frame. at aaa.bbb.com/xxx

即使 url 都在同一个域中,也会发生这种情况。我尝试使用 "document.domain" 检查域,我得到以下域名:

aaa.bbb.com - bbb.com

aaa.bbb.com/xxx - aaa.bbb.com

在这种情况下,aaa.bbb.com/xxx 是一个回调 url,它从第三方集成调用以提供授权代码。此回调 url 显示子域,但父页面未显示。

我认为从第三方网站调用 url 可能是问题所在。但是后来我用 window.open 打开这个回调 url,我得到了相同的 document.domain 值和关闭它时相同的异常。

您可以尝试在两个页面上明确设置 document.domain 以便它们匹配。

document.domain = 'aaa.bbb.com';

或者您可以使用 window.postMessage()

父文档:

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
  if (event.origin.indexOf('bbb.com') < 0 {
    return;
  } else if (event.data == 'closing'){
    windowClosing()
  }
}

子文档:

window.opener.postMessage('closing', '*');
self.close();

如果子 window 实际上是框架或 iframe,而不是单独的 window,那么您将使用:

window.parent.postMessage('closing', '*');
self.close();

无论哪种情况,您都需要确保两者的协议 (http/https) 和端口相同 windows/frames。