Mozilla CORS问题解决

时间:2017-09-11 23:23:53

标签: javascript firefox xmlhttprequest cors

我在页面上的脚本中有以下代码:

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"。

更新2

问题是由"隐私獾"试图阻止为追踪目的而进行的呼叫。它会阻止呼叫,但不会在控制台中输入。它还可以防止尝试获取页面出现在网络面板中。

我不确定为什么Privacy Badger对于在不同地方托管的网站的行为有所不同。我可能会在过去的某些方面表示我已批准'从这个站点访问该站点,它记住了这一点。但其他网站没有注册,因此被阻止。

经验教训:当您遇到浏览器问题时禁用所有插件

0 个答案:

没有答案