在我的webapp(嵌入在android webview中)中,我有一个登录页面:
$( document ).ready(function() {
if (db.isset("rememberMe") && db.get("rememberMe") == '1' && db.isset("passwordHash") && db.isset("email")) {
login(db.get("email"), db.get("passwordHash"));
}
});
//verify that there are some authentication info in the localstorage
function authenticateUser() {
if (!db.isset("userID") || !db.isset("token")) {
window.location.href ='login.html';
return false;
} else return true;
}
db对象只是一个localstorage函数包装器。 在页面中有一个简单的登录表单,有3个输入字段:电子邮件,密码和"记住我"复选框。 login函数只是向服务器发出一个ajax请求,而不是调用一个回调函数,该函数只是在本地存储中设置userID,token和其他一些信息,然后重定向到主页面:
function loginOK(data) {
hideLoading();
data = JSON.parse(data);
if (data.header.responseCode == "000") {
if ($("#rememberMeButton").is(':checked')) {
db.set("rememberMe", "1");
db.set("passwordHash", data.body.passwordHash);
}
else db.set("rememberMe", "0");
db.set("email", data.body.email);
db.set("userID", data.body.userID);
db.set("token", data.body.token);
if(authenticateUser()) window.location.href="lists.html";
在 lists.html 页面中,第一个操作是对未登录访问的控件:
$( document ).ready(function() {
if (!authenticateUser()) return; //IMPORTANT!
getLists(); //get user's lists infos
});
一切看起来都很简单,实际上这个代码几乎可以在我测试过的所有移动设备上运行良好,但在其他一些设备上却失败了。在这些设备上,如果用户成功登录,则重定向到lists.html页面,但由于某种原因,他被重定向回登录(authenticateUser函数返回false)。另外,如果他设置了“记住我”复选框,则会生成无限循环!!!
我们可以扣除3次: 1)如果用户被重定向到列表页面,则意味着authenticateUser func在登录页面上返回true,因此信息存储在localstorage中。 2)如果authenticationUsers在列表页面中失败,则表示在localStorage中找不到此类信息 3)当重定向回登录页面时,如果用户之前设置了“记住我”选项,则会触发自动登录,并且由于服务器返回成功。这意味着重定向后,登录页面中再次提供三个数据(rememberMe值,userID和令牌)。
怎么可能? 我发现有些人在处理文档中的本地存储时遇到了问题。处理器功能,但我还没有找到任何官方解释,这是错误的用法。而且,说实话,我不认为这应该是错的。
那么,问题在哪里?
更新:db对象定义:
function memoryManager() {
//set an item
this.set=set;
function set(name, value) {
if (value == undefined || value === undefined || value === null ) { return false; }
//if is an object json-encode it!
if (typeof value === "object") value = JSON.stringify(value);
localStorage.setItem(name, value);
return true;
}
//get an item
this.get = get;
function get(name) {
if (localStorage.getItem(name) === null) return null;
value = localStorage.getItem(name);
//check if it is an json encoded object or a simple value
try { JSON.parse(value); }
catch (e) { return value; }
return JSON.parse(value);
}
//is set an item?
this.isset = isset;
function isset(name) {
if (localStorage.getItem(name) === null) return false;
else return true;
}
}
//create instance:
var db = new memoryManager();