我有一个带jQuery 1.9.1的phonegap应用程序 只要用户名没有' @'就工作得很好其中的符号(如在电子邮件地址中)。 它只在iOS上失败。
我怀疑它可能不会对@符号或其他东西进行urlencoding。
Android ,工作正常。
$.ajax({
url: "https://" + this.hostname + "/alertusmw/services/rest/" + endPoint,
type: method,
dataType: 'json',
contentType: 'application/com.alertus-v1.0+json',
cache:false,
username: this.username,
password: this.password,
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization",
"Basic " + $.base64.encode(this.username + ":" + this.password));
},
data: options.data
}).done(function(response) {
console.log("DONE: " + method + ' completed: ');
console.log(response);
options.success( response );
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.log("FAIL: " + method + " FAILED: " + textStatus + "\n" + "ERROR THROWN: " + errorThrown);
console.log("jqXHR thing: ", jqXHR);
options.error(jqXHR,textStatus,errorThrown);
})
.always(function(jqXHR, textStatus, errorThrown) {
console.log("In the always", jqXHR, textStatus, errorThrown);
});
如果用户名没有' @'
,那么再次完美运作我怀疑它是url编码的原因是它是否将其发布为:
https://user@domain:password@blah.domain.com
,浏览器可能不会包含domain:password
部分作为主机(因为第一个@是用户分隔的内容:从域名传递...
这里有什么能帮助我解决这个问题:
^ - 我认为base64编码的全部内容完全是为了避免导致问题的特殊字符...所以我认为这可能是Chrome有用......
相关SO帖子: - Basic Authentication fails in cordova ios(没有答案,略有不同)
答案 0 :(得分:1)
我敢打赌问题不是使用contentType : "application/x-www-form-urlencoded"
。
无论如何,您绝对应该针对真实设备调试Webview,以在Safari控制台上查找xhr错误。如果您不熟悉Safari远程调试,那很简单:
答案 1 :(得分:0)
尝试在base64编码之前包装encodeURIComponent()。
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization",
"Basic " + $.base64.encode(encodeURIComponent(this.username + ":" + this.password)));
},
答案 2 :(得分:0)
如果base64encoded文本在另一端是UNencoded,它仍然看起来像(如你所说),user@domain:password@blah.domain.com
尝试使用这样的函数:
var getAuthToken = function (user, pass) {
var token = "";
if (user) {
token = token + encodeURIComponent(user);
}
if (pass) {
token = token + ":" + encodeURIComponent(pass);
}
token = $.base64.encode(token);
return "Basic " + token;
};
然后稍微更改您的代码:
xhr.setRequestHeader("Authorization", getAuthToken(this.username, this.password));