1

这是我的代码

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
setTimeout(function() {console.log(tl2010handle.window.location.href)}, 2000); 

如果我加载我的https://ec2b.foo.com/console/login2020.jsp 页面DOMException: Blocked a frame with origin "https://ec2b.foo.com" from accessing a cross-origin frame.

如果我在 /etc/hosts 中添加一个条目143.67.75.100 ec2b,然后在页面https://ec2b/console/login2020.jsp正常工作时加载我的页面,并且我的控制台会记录 href。

奥秘在于我打开的窗口的 URL 没有指定来源,所以我不明白 Chrome 怎么会抱怨我的请求是跨域的。

该代码仅存在于一台服务器上,因此 ec2b 和 ec2b.foo.com 不可能不同。也通过 dig 确认。我在 Chrome 和 Firefox 中都尝试过,结果相同,尽管在 Firefox 的情况下,tl2010handle 变量在第一种情况下未设置,而在第二种情况下设置。

4

1 回答 1

0

奥秘是我打开窗口的 URL 没有指定来源

您对Origin 请求标头有误解。在这些情况下,浏览器会发送 Origin ......在 JavaScript 的情况下,origin 是从执行脚本的页面继承的。您收到的错误消息表明您的来源设置为:“<a href="https://ec2b.foo.com" rel="nofollow noreferrer">https://ec2b.foo.com”</ p>

该代码仅存在于一台服务器上,因此 ec2b 和 ec2b.foo.com 不可能不同。

请注意,同源并不意味着同源。这意味着protocol:host:port元组应该完全相同,这意味着foo.com,ec2b.foo.com并且www.foo.com都是不同的来源(即使它们都指向同一个 IP)。


错误消息表明您的 JavaScript 的来源设置为:“<a href="https://ec2b.foo.com" rel="nofollow noreferrer">https://ec2b.foo.com”... 现在在您的 JavaScript 文件,通过运行以下命令打开一个新的浏览器窗口:

window.open("/path/main.html", ....); // <-- open a new browser window

你没有提到你在这个新窗口中看到的 URL 是什么(我怀疑它是“ https://ec2b/path/main.html ”)......但它肯定不是“<a href="https:/ /ec2b.foo.com" rel="nofollow noreferrer">https://ec2b.foo.com",这就是为什么当你尝试访问location.href这个新窗口时,你会被阻止,因为它是一个跨域请求。

根据MDNWindow.Open()返回一个 Window 对象,代表新创建的窗口:

返回的引用可以用于访问新窗口的属性和方法,只要它符合同源策略安全要求。

您还可以尝试运行以下脚本来找出 JavaScript 文件的来源:

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
console.log(tl2010handle.origin); // <-- origin of your script file
/*
 * if you compare: tl2010handle.origin with the url display in tl2010handle window
 * it should clarify why you are having a cross-origin request.
 */
于 2020-05-12T23:51:56.107 回答