以下是我的代码
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.
如果我添加一个条目 143.67.75.100 ec2b
到etchosts,然后将我的页面加载为 https://ec2b/console/login2020.jsp
它工作了,我的控制台记录了href。
谜团是我用一个没有指定来源的URL打开窗口,所以我不明白为什么Chrome会抱怨我的请求是跨来源的。
代码只存在于一台服务器上,所以不存在ec2b和ec2b.foo.com不同的可能性。我在Chrome和Firefox中都试过,结果一样,不过在Firefox中,tl2010handle变量在第一种情况下是未设置的,而在第二种情况下是设置的。
谜底是,我用一个没有指定来源的URL打开了窗口
你有一个错误的认识。原点请求头. 原点是由浏览器发送的,在 这种情况... 在JavaScripts的情况下,起源是 遗传性 在该页 执行脚本. 你得到的错误信息表明,你的原点被设置为。“https:/ec2b.foo.com”
该代码只存在于一台服务器上,所以不存在ec2b和ec2b.foo.com不同的可能性。
注意,同源并不意味着同ip。它的意思是 协议:主机:端口 元组应该是完全一样的,这意味着 foo.com
, ec2b.foo.com
和 www.foo.com
都是不同的起源(尽管它们都指向同一个IP)。
错误信息表明,你的JavaScript的起源被设置为:"https:/ec2b.foo.com。"......现在在你的JavaScript文件中,你打开一个新的浏览器窗口,运行以下内容。
window.open("/path/main.html", ....); // <-- open a new browser window
你还没有提到你在这个新窗口中看到的URL是什么(我怀疑是 "https:/ec2bpathmain.html。")......但它肯定不是"https:/ec2b.foo.com",这就是为什么当你试图访问的时候。location.href
的新窗口,你会被阻止,因为这是一个跨源请求。
根据 MDN: Window.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.
*/