1

在我使用 phonegap 制作的 android 应用程序中,用户可以登录。当他们这样做时,JQuery 会获取他们的登录名和密码,并按照 HTTP 基本身份验证规范使用他们的凭据进行 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"
                    }
                }
            });

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

任何想法 ?谢谢你的帮助

4

2 回答 2

5

通过更多的研究,我了解到问题出在 phonegap 上。服务器以状态 401 和标头响应 ajax 请求WWW-Authenticate : Basic realm="Secured Area"。WebView 拦截响应,并且由于标头,等待凭据。但是这种行为在手机上是不可见的,因此请求达到超时并触发 0 状态码。
一种好的解决方案是将服务器的响应更改为不包含 WWW-Authenticate 标头。我的解决方案(可能不好但很快)是将 0 状态视为 401 状态。

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

希望它可以帮助某人。

于 2013-03-27T22:04:33.980 回答
0

有趣的。我最近遇到了同样的问题,只是我将用户名和密码属性传递给 .ajax 而不是使用 beforeSend。

尝试将“$.base64.encode”更改为“btoa” https://developer.mozilla.org/en-US/docs/DOM/window.btoa

于 2013-03-27T17:02:51.597 回答