首頁 > 軟體

一文教你如何實現localStorage的過期機制

2022-02-28 19:01:51

前言

我們都知道cookie儲存的資料是可以新增過期時間屬性(Expires/Max-Age),實現過期的。 那麼,LocalStrorage、sessionStrorage可以設定過期嗎??

帶著這樣的疑問,我們一層層剝開其神祕的面紗。

cookie過期機制

我們知道Expires和Max-age都可以設定cookie的過期時間,那麼兩者存在什麼樣的異同點呢?

expires和max-age的區別

Expires 設定的是絕對值,即直接設定當前cookie在什麼時候過期。 就像下面圖中的這樣, GMT格式。

  • Expires在HTTP/1.0中已經定義
  • max-age在HTTP/1.1中才有定義,為了向下相容,僅使用max-age不夠;

Expires 設定一個絕對值,至少會帶來兩個方面的問題:

  • 使用者端和伺服器端時間不同步的問題。往往表現為時區不同、使用者端時間可被使用者自由修改。
  • 很容易在設定後忘記具體的過期時間,導致過期來臨出現浪湧現象(我的理解應該是同時大批次更新的問題)。

Max-Age代表存活時間,記錄的是一個相對時間(例如 6000s),起始時間點是伺服器記錄的requet-time。

我們看到除了上面提到的兩個值,還有 session, 這個值代表的意思就是在當前連線下,關閉瀏覽器視窗、斷開與服務連線,該資料即失效。

localStorage 資料過期

localstorage本身是沒有過期機制的,不過我們可以通過其他手段來擴充套件,使其能夠滿足我們的資料過期的需求。

需求分析:

  • 存入資料時,順帶傳入過去時間;
  • 獲取資料時,判斷當前是否過期,過期返回 undefined; 否則正常返回資料。

動手實踐

localStorage 和 sessionStorage 都繼承自 Storage 物件, 所以我們可以擴充套件Storage原型方法。

setStorageWithAge(key, value, age) 方法, 接收三個引數,第三個引數代表最大過期時間,我們這裡參考 cookie的 Max-Age 的實現,用相對時間來做。

getStorageWithAge(key),內部直接判斷時間是否過期來返回對應的值。

程式碼實現:

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;
};

嘗試呼叫:

localStorage.setStorageWithAge('amingxiansen', '測試過期時間', 30000);
localStorage.getStorageWithAge('amingxiansen');

設定30s的過期時間,過期之前和過期之後獲取到的結果。

參考文章

總結

Storage只是瀏覽器的一種儲存方案,除此之外還有IndexDB、WebSQL等。

這種實現資料過期機制的思路比較通用,可以擴充套件到其他需要設定資料過期的場景下。

到此這篇關於如何實現localStorage過期機制的文章就介紹到這了,更多相關localStorage的過期機制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com