一文教你如何實現(xiàn)localStorage的過期機制
前言
我們都知道cookie存儲的數(shù)據(jù)是可以添加過期時間屬性(Expires/Max-Age),實現(xiàn)過期的。 那么,LocalStrorage、sessionStrorage可以設(shè)置過期嗎??
帶著這樣的疑問,我們一層層剝開其神秘的面紗。
cookie過期機制
我們知道Expires和Max-age都可以設(shè)置cookie的過期時間,那么兩者存在什么樣的異同點呢?
expires和max-age的區(qū)別
Expires 設(shè)置的是絕對值,即直接設(shè)置當(dāng)前cookie在什么時候過期。 就像下面圖中的這樣, GMT格式。

- Expires在HTTP/1.0中已經(jīng)定義
- max-age在HTTP/1.1中才有定義,為了向下兼容,僅使用max-age不夠;
Expires 設(shè)置一個絕對值,至少會帶來兩個方面的問題:
- 客戶端和服務(wù)端時間不同步的問題。往往表現(xiàn)為時區(qū)不同、客戶端時間可被用戶自由修改。
- 很容易在配置后忘記具體的過期時間,導(dǎo)致過期來臨出現(xiàn)浪涌現(xiàn)象(我的理解應(yīng)該是同時大批量更新的問題)。
Max-Age代表存活時間,記錄的是一個相對時間(例如 6000s),起始時間點是服務(wù)器記錄的requet-time。
我們看到除了上面提到的兩個值,還有 session, 這個值代表的意思就是在當(dāng)前連接下,關(guān)閉瀏覽器窗口、斷開與服務(wù)連接,該數(shù)據(jù)即失效。

localStorage 數(shù)據(jù)過期
localstorage本身是沒有過期機制的,不過我們可以通過其他手段來擴展,使其能夠滿足我們的數(shù)據(jù)過期的需求。
需求分析:
- 存入數(shù)據(jù)時,順帶傳入過去時間;
- 獲取數(shù)據(jù)時,判斷當(dāng)前是否過期,過期返回 undefined; 否則正常返回數(shù)據(jù)。
動手實踐
localStorage 和 sessionStorage 都繼承自 Storage 對象, 所以我們可以擴展Storage原型方法。
setStorageWithAge(key, value, age) 方法, 接收三個參數(shù),第三個參數(shù)代表最大過期時間,我們這里參考 cookie的 Max-Age 的實現(xiàn),用相對時間來做。
getStorageWithAge(key),內(nèi)部直接判斷時間是否過期來返回對應(yīng)的值。
代碼實現(xiàn):
Storage.prototype.setStorageWithAge = (key, value, age) => {
if (isNaN(age) || age < 1) throw new Error("age must be a number");
const obj = {
data: value, //存儲值
time: Date.now(), //存值時間戳
maxAge: age, //過期時間
};
localStorage.setItem(key, JSON.stringify(obj));
};
Storage.prototype.getStorageWithAge = key => {
const { data, time, maxAge } = JSON.parse(localStorage.getItem(key));
if (time + maxAge < Date.now()) {
localStorage.removeItem(key);
return undefined;
}
return data;
};嘗試調(diào)用:
localStorage.setStorageWithAge('amingxiansen', '測試過期時間', 30000);
localStorage.getStorageWithAge('amingxiansen');
設(shè)定30s的過期時間,過期之前和過期之后獲取到的結(jié)果。
參考文章
總結(jié)
Storage只是瀏覽器的一種存儲方案,除此之外還有IndexDB、WebSQL等。
這種實現(xiàn)數(shù)據(jù)過期機制的思路比較通用,可以擴展到其他需要設(shè)置數(shù)據(jù)過期的場景下。
到此這篇關(guān)于如何實現(xiàn)localStorage過期機制的文章就介紹到這了,更多相關(guān)localStorage的過期機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
讓低版本瀏覽器支持input的placeholder屬性(js方法)
低版本瀏覽器一般都不會支持input的placeholder屬性,接下來使用js實現(xiàn)下,感興趣的朋友可以參考下哈2013-04-04
Javascript 實現(xiàn)廣告后加載 可加載百度谷歌聯(lián)盟廣告
本文主要介紹一種新的廣告后加載的方式,支持自定義HTML廣告、百度聯(lián)盟廣告和谷歌聯(lián)盟廣告。這種方式在頁面加載完成后執(zhí)行,不影響內(nèi)容的顯示,對用戶更加友好。2016-05-05
微信小程序?qū)崿F(xiàn)文字長按復(fù)制與一鍵復(fù)制功能全過程
微信小程序開發(fā)是依托微信的,所以他的代碼是嵌入在微信的原始代碼之中的,這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)文字長按復(fù)制與一鍵復(fù)制功能的相關(guān)資料,需要的朋友可以參考下2023-03-03
uniapp開發(fā)小程序?qū)崿F(xiàn)全局懸浮按鈕的代碼
這篇文章主要介紹了uniapp開發(fā)小程序如何實現(xiàn)全局懸浮按鈕,但是在uniapp中式?jīng)]有window對象,和dom元素的,需要獲取頁面上節(jié)點的幾何信息,具體實例代碼詳細跟隨小編一起看看吧2022-03-03
js實現(xiàn)的真正的iframe高度自適應(yīng)(兼容IE,FF,Opera)
由于項目上的需要,要用一個iframe高度自適應(yīng)的功能,在google上搜了很久,找了一些修改了下。大家可以測試下。2010-03-03
js如何準確獲取當(dāng)前頁面url網(wǎng)址信息
這篇文章主要為大家介紹了js準確獲取當(dāng)前頁面url網(wǎng)址信息的多種方法,包括正則法、split拆分法等,需要的朋友可以參考下2016-04-04

