在 web 開發(fā)中萤衰,我們知道 cookie堕义、session、localStorage都可以保存用戶的數(shù)據(jù)脆栋,cookie的 domain倦卖、path 限制了 cookie 的跨域, 有數(shù)量和大小的限制椿争,可以設(shè)置有效時間怕膛。 session是后臺在瀏覽器注入一個設(shè)置了 httponly 的不可讀取的 cookie , session data由后臺保存在數(shù)據(jù)庫或者內(nèi)存中秦踪,在web中嘉竟,session 是靠 cookie 作為唯一標(biāo)示來實現(xiàn)的,也可以設(shè)置過期時間。 localStorage 是 H5 的數(shù)據(jù)存儲辦法舍扰, 也是有大小限制的倦蚪,但是不可以設(shè)置過期時間。 本文主要說的是如何自定義辦法讓 localStorage實現(xiàn)過期時間边苹。
module.exports = {
// 過期時間陵且,默認(rèn)30天
age: 30*24*60*60*1000,
/**
* 設(shè)置過期時間
* @param age
* @returns {exports}
*/
setAge: function(age){
this.age = age;
return this;
},
/**
* 設(shè)置 localStorage
* @param key
* @param value
*/
set: function(key, value){
localStorage.removeItem(key);
var isObject = value instanceof Object,
_time = new Date().getTime(),
_age = this.age;
// 如果不是對象,新建一個對象把 value 存起來
if(!isObject) {
var b = value;
value = {};
value._value = b;
}
// 加入時間
value._time = _time;
// 過期時間
value._age = _time + _age;
// 是否一個對象
value._isObject = isObject;
localStorage.setItem(key, JSON.stringify(value));
return this;
},
/**
* 判斷一個 localStorage 是否過期
* @param key
* @returns {boolean}
*/
isExpire: function(key) {
var isExpire = true,
value = localStorage.getItem(key),
now = new Date().getTime();
if(value) {
value = JSON.parse(value);
// 當(dāng)前時間是否大于過期時間
isExpire = now > value._age;
} else {
// 沒有值也是過期
}
return isExpire;
},
/**
* 獲取某個 localStorage 值
* @param key
* @returns {*}
*/
get: function(key) {
var isExpire = this.isExpire(key),
value = null;
if(!isExpire) {
value = localStorage.getItem(key);
value = JSON.parse(value);
if(!value._isObject) {
value = value._value;
}
}
return value;
}
};
使用
var localstorage = require('./localstorage.js');
localstorage.setAge(24*60*60*1000).set('a': 'abc').set('b',{a:1,b:2})
在ios設(shè)備上無法重復(fù)setItem()
另外个束,在iPhone/iPad上有時設(shè)置setItem()時會出現(xiàn)詭異的QUOTA_EXCEEDED_ERR錯誤慕购,這時一般在setItem之前,先removeItem()就ok了茬底。