Cordova 使用Phonegap处理windows Phone上的401未经授权的错误
我正在windows phone 7上使用phonegap创建一个应用程序,该应用程序需要在服务器上进行身份验证。当我们使用正确的用户名和密码登录时,我们的状态为200。一切正常。但是,如果我们在登录或密码上出错,服务器会向我们返回一个401错误。这冻结了我的申请。我需要杀死它并重新启动它。所以不是很练习 我在电脑上用fiddler检查响应,手机收到401错误,我在代码中管理这个错误。这在我的另一个平台(android和ios)上运行 所以我想知道我如何处理这个错误。也许我可以更改windows phone项目上的cs文件来处理此错误 欢迎任何帮助 这是密码Cordova 使用Phonegap处理windows Phone上的401未经授权的错误,cordova,windows-phone,http-status-code-401,unauthorized,Cordova,Windows Phone,Http Status Code 401,Unauthorized,我正在windows phone 7上使用phonegap创建一个应用程序,该应用程序需要在服务器上进行身份验证。当我们使用正确的用户名和密码登录时,我们的状态为200。一切正常。但是,如果我们在登录或密码上出错,服务器会向我们返回一个401错误。这冻结了我的申请。我需要杀死它并重新启动它。所以不是很练习 我在电脑上用fiddler检查响应,手机收到401错误,我在代码中管理这个错误。这在我的另一个平台(android和ios)上运行 所以我想知道我如何处理这个错误。也许我可以更改windows
$.support.cors = true;
$.ajax({
type: "POST",
dataType: "HTTP/1.1",
url: 'https://xxx.xxx-xxx.com/issue/wrap',
data: data,
cache: 'false',
async: false,
error: function (data) {
console.log(data);
console.log("error");
//navigator.notification.alert(data);
},
complete: saveToken
});
谢谢Sup,您是如何进行身份验证的 如果您使用
XMLHttpRequest()
像:var-request=new-XMLHttpRequest()代码>
尝试检查somth的情况,比如:console.log(“状态:+request.status”)代码>
如果它似乎有效,您可以使用:
if (request.status == 401) {
// blabla
return;
}
我也遇到了同样的问题,我找到的唯一解决方案就是实现一个Phonegap插件
以下是我使用的C代码:
namespace WPCordovaClassLib.Cordova.Commands
{
[DataContract]
public class PhonegapWindowsPhonePostObject
{
[DataMember(IsRequired = false, Name = "yourParamName1")]
public string yourParam1;
[DataMember(IsRequired = false, Name = "yourParamName2")]
public string yourParam2;
}
public class PhonegapWindowsPhonePost: BaseCommand
{
public void post(string options)
{
PhonegapWindowsPhonePostObject pwppo = JSON.JsonHelper.Deserialize<PhonegapWindowsPhonePostObject>(options);
try
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var data = "YOUR DATA STRING HERE"; //use the pwppo object to retrieve your parameters
var url = "URL OF THE SERVICE HERE";
WebClient wc = new SharpGIS.GZipWebClient();
var URI = new Uri(url);
wc.Encoding = Encoding.UTF8;
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
wc.UploadStringCompleted += new UploadStringCompletedEventHandler(wc__UploadStringCompleted);
wc.UploadStringAsync(URI, "POST", data);
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
try
{
if (e.Result != null)
this.DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result));
else
this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error 401"));
}
catch (Exception ex)
{
this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ex.Message));
// no http status code available
}
}
}
}
我希望它能帮助你
注意:Phonegap 2.8版本并不能解决与发行说明相反的问题
再见 过去几个月我一直有这个问题,最后终于解决了
首先,我们使用的临时解决方法是对请求实现超时。这是可行的,但反应总是404。我们不知道它是否真的没有通过身份验证,或者我们的服务是否停止了。对于我们的系统来说,这不是一个可接受的解决方案
最后,通过谷歌搜索,我发现了真正的问题
当401被返回时(这是一个基本的身份验证,身份验证失败),它会向响应添加一个标题,称为“WWW Authenticate”。这会告诉浏览器提示用户尝试登录。iOS webview不知道该怎么办,因此应用程序会挂起
从您的服务中,您需要做的就是删除WWW Authenticate标头,您应该开始在错误函数中看到401。您是如何进行身份验证的?我已经这样处理了错误。但问题是,当401返回时,应用程序只是冻结。我们无法在javascript代码中处理响应。那么,sry,不知道,冷静下来,做些爆米花。您试图将请求包装在一个try catch中-tryception:dw为什么不让服务器端返回字符串“denied”而不是error?我正在尝试查找文档,但基本上PhoneGap无法捕获401状态响应。为此,我在登录尝试时实现了10秒的超时,然后“假设”如果超时,则是错误的用户名/密码。真希望科尔多瓦能把这个修好!希望Phonegap或Microsoft能够解决这个问题,如果是因为IEI在cordova问题跟踪程序上打开了一个问题,因为我有一个类似/相同的问题:我甚至在cordova 3.1上也遇到了问题-我在这里发布了我的解决方案。它也是一个插件。
function loginToWebService(yourParam1, yourParam2) {
var options = { "yourParamName1": yourParam1, "yourParamName2": yourParam2};
cordova.exec(success, error,"PhonegapWindowsPhonePost","post", options);
}