当我设置错误的凭据时,为什么我的http basic auth请求获得状态0?Phonegap Android

gui*_*meb 1 jquery android xmlhttprequest basic-authentication cordova

在我使用phonegap制作的Android应用程序中,用户可以登录.当他们这样做时,JQuery获取他们的登录名和密码,并根据HTTP Basic Auth规范使用他们的凭据进行ajax调用.一切正常.
但是,当用户设置错误的凭据时,我遇到了处理这种情况的问题.在.error()回调中,我想显示状态401的特定消息(如"身份验证失败")和其他状态的消息("技术问题").我的代码:

$.ajax({
                url: "http://exemple.com",
                type: "GET",
                dataType: "text",
                contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                beforeSend: function (xhr)
                {
                    xhr.setRequestHeader("Authorization", "Basic "+$.base64.encode(email+":"+password));
                },
                success: function() {
                    //my success callback
                },
                error: function(xhr) {
                    if(xhr.status===401) {
                        //"authentication failed"
                    }
                    else {
                        //"technical problem"
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

此代码在浏览器中正常工作.状态401被发送.但是,当我在我的phonegap android应用程序中测试时,状态发送为0.当我的凭据良好时,状态发送为200,而我的应用程序的其他请求运行良好,所以我不认为这是一个cors问题.

任何的想法 ?谢谢你的帮助

gui*_*meb 5

随着更多的研究,我明白问题来自于手机差距.服务器以状态401和WWW-Authenticate : Basic realm="Secured Area"标头响应ajax请求.WebView拦截响应,并且由于标头,等待凭据.但是这种行为在手机上是不可见的,因此请求到达超时并触发0状态代码.
一个好的解决方案是将服务器的响应更改为不包括WWW-Authenticate标头.我的解决方案可能很糟糕但很快,就是将0状态视为401状态.

error: function(xhr) {
                        if(xhr.status===401 || xhr.status===0) {
                            //'authentication failed'
                        }
                        else {
                            //'technical error'
                        }
                    }, 
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.