在实际使用Ajax方法之前,有没有一种“安全”的方式来检查同源策略是否适用于某个URL?这是我的代码:
function testSameOrigin(url) {
var loc = window.location,
a = document.createElement('a');
a.href = url;
return a.hostname == loc.hostname &&
a.port == loc.port &&
a.protocol == loc.protocol;
}
这是一种安全可靠的方法,前提是你不要做(或者说不要做)某些事情。
这种方式有点像手工猜测,基于维基百科文章所述。
在“正常”的情况下,这应该完全可行。如果你计划使用跨域脚本,则需要进行修改。
如果你在脚本中修改了document.domain
,例如从“foo.example.com”和“bar.example.com”到“example.com”,则你的testSameOrigin
函数将对“http://example.com”返回false
,实际上它应该返回true
。
如果你计划修改document.domain
,可以在你的脚本中添加一个检查。
如果你计划使用CORS(参见上面的链接)来允许跨域通信,则它也会返回错误结果。但是如果你使用CORS,你将有一个可以通信的域名列表,你可以将该列表添加到该函数中。
有没有更好的预先检查跨域允许的方法?可以使用jQuery。
也许没有,尽管值得一提的是,你从Steve的答案中在控制台看到的可能是“观察者谬论”... 这些错误看起来像是控制台试图检查另一个窗口而不是脚本产生的。
假设你没有搞乱document.domain
或使用CORS,则你原来的解决方案可能更好,因为它不需要进行额外的请求来确定服务器是否可用。即使你正在执行某些跨域脚本,修改你现有的函数以适应它可能是最好的选择。
readystate=4
和statuscode=0
,这与被中止的请求类似。 既然您无论如何都需要防范被中止的请求,为什么还需要进行此检查呢?我觉得这项安全措施是由外部强制执行的,您对此无法控制,因此任何在环境内部进行的检查都是错误的。所以我认为您永远不应该进行此检查,只需让请求失败即可。 - Halcyon