我在页面上的脚本中有以下代码:
function getJSON(url, passedFunction) {
console.log("getJSON start: "+url);
var xhr = new XMLHttpRequest();
globalForXhr = xhr;
xhr.open("GET", url, true);
xhr.overrideMimeType("application/json"); //stop Mozilla bug
xhr.withCredentials = true;
xhr.onreadystatechange = function() {
console.log("getJSON ready state change: "+xhr.readyState+" and xhr: "+xhr.status);
if (xhr.readyState == 4 && xhr.status == 200) {
try {
passedFunction(JSON.parse(xhr.responseText));
}
catch (e) {
alert("Got an exception ("+e+") whille trying to handle: "+url);
}
}
}
xhr.send();
}
我有两种情况:页面由远程服务器S1提供,代码正在调用另一台远程服务器S2。所有标准的CORS标头都已就绪,这在Mozilla和Chrome中均可正常使用。
但是,我也在我的本地机器L1上运行TomCat,并再次调用相同的远程服务器S2。当从L1(通过http)提供服务时,它可以在Chrome中运行,但在Mozilla中却失败了。
首先是对本地服务器(提供页面)的调用,然后第二个是对全局外部S2的调用。 chrome中的控制台输出是:
getJSON start: http://myserver.local:8080/weaver/auth/
getJSON ready state change: 2 and xhr: 200
getJSON ready state change: 3 and xhr: 200
getJSON ready state change: 4 and xhr: 200
getJSON start: https://external.server.com/eid/?openid.mode=apiWho
getJSON ready state change: 2 and xhr: 200
getJSON ready state change: 3 and xhr: 200
getJSON ready state change: 4 and xhr: 200
但是,在Mozilla中,只有在从本地TomCat服务器提供页面时才会出现故障,仅在请求远程服务器时才会出现故障,并且仅在Mozilla中出现:
"getJSON start: http://myserver.local:8080/weaver/auth/"
getJSON ready state change: 2 and xhr: 200
getJSON ready state change: 3 and xhr: 200
getJSON ready state change: 4 and xhr: 200
"getJSON start: https://external.server.com/eid/?openid.mode=apiWho"
getJSON ready state change: 2 and xhr: 0
getJSON ready state change: 4 and xhr: 0
当调用远程(S2)服务器时,xhr.status返回零。网上有很多讨论关于这种状态如何在各种情况下归零的情况,这些情况最好记录在案。其中许多都是Mozilla决定中止调用,因为跨站点脚本妄想 - 并且它实际上并没有告诉你何时这样做。
我怀疑Mozilla可能会检测到从本地服务器提供页面,然后Mozilla会中止请求,并且在没有告知原因的情况下就会失败。
有没有人知道如何确认Mozilla未能提出请求的原因?
我看到了一些关于设置Mozilla的方法的文档,以便它可以继续发出请求,但是其他说明在2015年已经删除了。我想在本地服务器上测试我在Mozilla中的站点。有谁知道关闭这种行为的方法?
网络标签中没有提及此次通话。对... / weaver / auth的调用有200响应,但对外部服务器的调用根本没有出现在列表中。没有任何错误消息,我可以在任何地方找到。它根本没有提出要求。非常令人沮丧。
为了确保自己这不是缓存问题,我更改了所请求的URL(通过添加虚拟查询参数)并且行为保持不变:适用于Chrome,状态= 0在Mozilla上。
外部服务器是https,它有一个有效的证书。这是一个身份服务器,我使用它来验证用户 - 显然,调用它的唯一方法是通过https。当页面从另一个(S1)服务器(也是http)提供时,混合的http和https不是问题。
我必须使用凭据进行呼叫,因为这是一个单点登录协议。如果某人已登录身份服务器,我希望他们立即进行身份验证。那来自饼干。在没有凭证的情况下拨打电话会破坏SSO的整个目的。如果我删除' withCredentials'页面被提取没有问题(但当然用户的身份验证被取消)。
服务器的标头包含Access-Control-Max-Age,其值为" 1"。
问题是由"隐私獾"试图阻止为追踪目的而进行的呼叫。它会阻止呼叫,但不会在控制台中输入。它还可以防止尝试获取页面出现在网络面板中。
我不确定为什么Privacy Badger对于在不同地方托管的网站的行为有所不同。我可能会在过去的某些方面表示我已批准'从这个站点访问该站点,它记住了这一点。但其他网站没有注册,因此被阻止。
经验教训:当您遇到浏览器问题时禁用所有插件