获取同一域中 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。
我正在尝试关闭此页面并使用代码刷新父页面:
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。