Javascript document.ready中的localstorage在某些设备上加载失败
在嵌入android webview的我的webapp中,我有一个登录页面: db对象只是一个localstorage函数包装器。 页面中有一个简单的登录表单,有3个输入字段:电子邮件、密码和“记住我”复选框。 登录函数只是向服务器发出一个ajax请求,而不是调用一个回调函数,该函数只是在本地存储中设置用户ID、令牌和一些其他信息,然后重定向到主页:Javascript document.ready中的localstorage在某些设备上加载失败,javascript,local-storage,web-storage,Javascript,Local Storage,Web Storage,在嵌入android webview的我的webapp中,我有一个登录页面: db对象只是一个localstorage函数包装器。 页面中有一个简单的登录表单,有3个输入字段:电子邮件、密码和“记住我”复选框。 登录函数只是向服务器发出一个ajax请求,而不是调用一个回调函数,该函数只是在本地存储中设置用户ID、令牌和一些其他信息,然后重定向到主页: function loginOK(data) { hideLoading(); data = JSON.p
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和token在重定向后在登录页面中再次可用
怎么可能呢?
我发现有些人在处理document.ready handler函数中的localstorage时遇到问题,但我还没有找到任何官方解释,说明这是否是一种错误用法。老实说,我不认为这是错的
那么,问题在哪里
更新:数据库对象定义:
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();
您可以自己尝试一些简单的调试。如果支持localStoreage,则ifwindow.localStorage返回true。先检查一下。之后,尝试将localStoreage的全部内容转储到日志或其他内容中,然后查看存储的内容。我的五美分。但是,我想这是一个问题,因为并非所有设备都支持本地存储。顺便说一句,javascript中的身份验证根本不安全。您好,我已经进行了一些调试,并且支持本地存储。此外,如您所见,在重定向到列表页面之前,我执行了相同的authenticateUSer函数,该函数在localstorage中查找信息。最终的证明是,如果生成循环,这意味着自动登录成功,然后在2°重定向登录->列表,列表->登录否后,信息在登录页面中再次可用,我想一定有一个更棘手的问题,可能与本地存储性能和实现有关,或者从内存/磁盘读取/写入。isset是如何创建的?在文档中看不到该方法。只是用db对象定义更新了问题我意识到在webview失败的相同设备上,相同的应用程序在通过标准android浏览器加入其在线版本时工作正常!
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();