摘要:前言開發(fā)過程少不了會遇到給某個狀態(tài)設(shè)置過期時間的需求例如進(jìn)入頁面有個默認(rèn)彈窗用戶關(guān)閉之后在小時之內(nèi)再次打開不能再彈面對這樣需求我們首先想到的是需要設(shè)置一個變量去控制彈窗的隱藏因?yàn)槟J(rèn)是開啟的如何去保證這個變量的有效時間呢這里就涉及到數(shù)據(jù)的持
前言
開發(fā)過程少不了會遇到給某個狀態(tài)設(shè)置過期時間的需求,例如:進(jìn)入頁面有個默認(rèn)彈窗,用戶關(guān)閉之后在 1 小時之內(nèi)再次打開不能再彈; 面對這樣需求我們首先想到的是需要設(shè)置一個變量去控制彈窗的隱藏(因?yàn)槟J(rèn)是開啟的), 如何去保證這個變量的有效時間呢? 這里就涉及到數(shù)據(jù)的持久化,前端數(shù)據(jù)持久化可以理解為客戶端數(shù)據(jù)的持久化, 就是數(shù)據(jù)存儲在本地; 我們馬上就想到了 cookie,localStorage,sessionStorage這些屬性了...
下面先來解決這個需求, 稍后繼續(xù)再說一下他們區(qū)別
cookie是以鍵值對的形式保存在瀏覽器本地的一段文本字符串(前提是瀏覽器未禁用cookie),各個cookie字段之間一般是以“;”分隔,即"key=value;xxx=yyy"的格式...
js操作cookie的方式是通過 window.cookie來進(jìn)行讀寫的;其中expires字段是: 設(shè)置cookie的生存時間,當(dāng)設(shè)置了一個時間點(diǎn)后,每次訪問瀏覽器會用當(dāng)前時間和cookie的expries做比對,如果過期cookie則會被刪除,這樣我們可以通過判斷是否存在 cookie 來關(guān)閉彈窗提示了;
代碼展示// 設(shè)置 cookie const setCookie = (name, value, time) => { let currentTime = new Date().getTime(); let expireTime = new Date(currentTime + time); document.cookie = name + "="+ value + ";expires=" + expireTime.toGMTString(); } // 獲取 cookie const getCookie = name => { let strCookie = document.cookie; let arrCookie = strcookie.split(";"); // 遍歷匹配 for (let i = 0; i < arrCookie.length; i++) { let temp = arrCookie[i].split("="); if (temp[0] === name) { return temp[1]; } } return ""; } // 進(jìn)入頁面時就判斷是否存在設(shè)定cookie值, 沒有就默認(rèn)顯示;如果有就不顯示彈窗; // 當(dāng)我們點(diǎn)擊關(guān)閉時設(shè)置 cookie 的過期時間, 這里的業(yè)務(wù)代碼就不寫了通過 localStorage 來設(shè)置
思路基本差不多, 就是在設(shè)置的時候額外添加一個時間戳,然后取出來與當(dāng)前時間做比較, 下面就直接上代碼了.
代碼展示// 判斷數(shù)據(jù)類型 dataType = data => { return Object.prototype.toString.call(data).slice(8, -1); }; // 封裝我的localStorge const myLocalStorage = { /** * @desc 設(shè)置緩存 + 過期時間 * @param {String} item * @param {any} value * @param {Number} expire */ set(item, value, expire) { value = dataType(value) === "Object" ? JSON.stringify(value) : value; if (expire) { value += "?expire=" + (this.getTime() + expire); } window.localStorage.setItem(item, value); }, // 獲取值 get(item) { let data = window.localStorage.getItem(item) || ""; let expireIndex = data.indexOf("?expire="); let expireTime = data.substring(expireIndex); let value = data.substring(0, expireIndex > 0 ? expireIndex : data.length); if (expireTime) { expireTime = expireTime.substring(8); if (expireTime < this.getTime()) { // 過期... this.clear(item); return ""; } else { // 未過期... return this.getValue(value); } } }, // 清除 clear(item) { window.localStorage.removeItem(item); }, // 獲取當(dāng)前時間 getTime() { return new Date().getTime(); }, // 獲取數(shù)據(jù) getValue(value) { // 這里還不夠嚴(yán)謹(jǐn), 判斷json為數(shù)組和對象 if (value.includes("{") || value.includes("[")) { return JSON.parse(value); } else { return value; } }, }; // 業(yè)務(wù)代碼 // ================================== import { myLocalStorage } from "@/common/js/tool"; export default { data() { return { tips: "" }; }, created() { this.getTip(); }, methods: { closeTip() { this.tips = false; this.setTip(); }, setTip() { myLocalStorage.set("showTip", "24 hours later", 24*60*60*1000); }, getTip() { this.tips = myLocalStorage.get("showTip") || ""; } }, computed: { isShowTip() { return this.tips === ""; } } };說說localStorage,cookie 和 sessionStorage
其實(shí)寫這篇文章的目的主要想梳理一下自己對這幾個特性的理解,分別從作用域,存儲大小,生命周期,注意事項來說
window.cookie1.一般由服務(wù)端生成,保存在瀏覽器端的一段字符串,參與服務(wù)端通信,會攜帶在請求頭中; 服務(wù)端可以通過request修改,客戶端也可以通過window.cookie 來修改 2.作用域范圍 遵循同源策略; 注意 domain 參數(shù)的設(shè)置,頂級域名下二級,三級域名是可以實(shí)現(xiàn)cookie共享的 3.大小 一般為 4K左右, 瀏覽器有個數(shù)限制 20 4.生命周期 設(shè)置 expires ;根據(jù)具體需求時間設(shè)置window.localStorage
1.存儲在瀏覽器本地的一段字符串,不參與和服務(wù)端的通信 2.作用域范圍 同樣遵循同源策略,同源站點(diǎn)可以在同一瀏覽器下進(jìn)行讀寫操作 3.大小 5M左右 4.生命周期 一直存在,除非人為清除window.sessionStorage
1.也是存儲在瀏覽器本地的一段字符串,不參與和服務(wù)端的通信 2.作用域范圍 同樣遵循同源策略,同源站點(diǎn),同一tab標(biāo)簽頁可以在同一瀏覽器下進(jìn)行讀寫操作; 即:只有同一瀏覽器、同一窗口的同源頁面才能共享數(shù)據(jù);如果新開一個 tab 標(biāo)簽是不行的 3.大小 5M左右 4.生命周期 與標(biāo)簽頁同在; tab 標(biāo)簽關(guān)了,則數(shù)據(jù)清除
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105410.html
摘要:而且這樣做的話,會存在多個令牌同時有效,可能會引起一些安全問題。這種做法也是很多人采用的一種。對于續(xù)期的話,個人覺得第二種方案是比較好的一種方案。而退出的話,如果不考慮泄露的問題,那么第一種方案是比較好的一種方案。這些都是自己對的一些理解。 在使用jwt的過程中發(fā)現(xiàn)了兩個問題續(xù)期和退出的問題。 續(xù)期 因?yàn)閖wt的token在簽發(fā)之后是有過期時間的,所以就存在管理這個過期時間的問題。我看...
摘要:通常,它用于告知服務(wù)端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態(tài)。使基于無狀態(tài)的協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。標(biāo)記為的只應(yīng)通過被協(xié)議加密過的請求發(fā)送給服務(wù)端。 前記 前面我已經(jīng)寫了一篇關(guān)于Cookie的文章,但是那時候我其實(shí)理解的并不是很深刻,會有些搞不懂的地方,今天我就再寫一次,博客也是我的學(xué)習(xí)筆記 Cookie Cookie是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)...
摘要:接下來的內(nèi)容中我們將通過緩存位置緩存策略以及實(shí)際場景應(yīng)用緩存策略來探討瀏覽器緩存機(jī)制。是運(yùn)行在瀏覽器背后的獨(dú)立線程,一般可以用來實(shí)現(xiàn)緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了。一個優(yōu)秀的緩存策略可以縮短網(wǎng)頁請求資源的距離,減少延遲,并且由于緩存文件可以重復(fù)利用,還可以減少帶寬,降低網(wǎng)絡(luò)負(fù)荷。對于一個數(shù)據(jù)請求來說,可以分為...
摘要:的過期策略是什么樣的采用了定期刪除惰性刪除的過期策略。定期刪除原理定期刪除指的是默認(rèn)每隔就隨機(jī)抽取一些設(shè)置了過期時間的,檢測這些是否過期,如果過期了就將其刪掉。所有只會抽取一部分而不會全部檢查。 1.數(shù)據(jù)為什么會過期? 首先,要明白redis是用來做數(shù)據(jù)緩存的,不是用來做數(shù)據(jù)存儲的(當(dāng)然也可以當(dāng)數(shù)據(jù)庫用),所以數(shù)據(jù)時候過期的,過期的數(shù)據(jù)就不見了,過期主要有兩種情況, ①在設(shè)置緩存數(shù)據(jù)時制定了...
摘要:在使用非對稱加密算法進(jìn)行簽名的時候,還可以用于驗(yàn)證的發(fā)件人是否與中申明的發(fā)件人是同一個人。如果沒有用非對稱加密算法的話,把復(fù)制之后直接可以去官網(wǎng)在線解析。 這篇博客主要是簡單介紹了一下什么是JWT,以及如何在Spring Boot項目中使用JWT(JSON Web Token)。 1.關(guān)于JWT 1.1 什么是JWT 老生常談的開頭,我們要用這樣一種工具,首先得知道以下幾個問題。 這...
閱讀 435·2019-08-29 12:44
閱讀 3013·2019-08-26 17:49
閱讀 2443·2019-08-26 13:40
閱讀 1189·2019-08-26 13:39
閱讀 3668·2019-08-26 11:59
閱讀 1830·2019-08-26 10:59
閱讀 2469·2019-08-23 18:33
閱讀 2698·2019-08-23 18:30