解決右鍵打開新的標籤頁,sessionStorage失效。

問題:項目使用sessionStorage存儲已登錄用戶的token和用戶信息,當右鍵新打開標籤頁時,sessionStorage爲空,需重新登錄。

需求:瀏覽器關閉時,清空用戶所有登錄信息,下次打開瀏覽器需重新登錄。

方法:我們將token保存在sessionStorage,並在每次請求服務器時將token放在請求頭中來完成用戶的身份認證。當用戶關閉標籤頁,token會立即過期。

問題來了,多標籤應該怎麼辦呢?

利用localStorage事件來跨標籤頁共享sessionStorage。
當用戶新開一個標籤頁時,我們先來詢問其它已經打開的標籤頁是不是有需要給我們共享的sessionStorage數據。如果有,現有的標籤頁會通過localStorage事件來傳遞數據到新打開的標籤頁中,我們只需要複製一份到本地sessionStorage即可。
傳遞過來的sessionStorage絕對不會保存在localStorage,從localStorage事件將數據中複製並保存到sessionStorage,這個流程是在同一個調用中完成,沒有中間狀態。而且數據是對應事件攜帶的,並不在localStorage中。
代碼實例:

(function() {

	if (!sessionStorage.length) {
		// 這個調用能觸發目標事件,從而達到共享數據的目的
		localStorage.setItem('getSessionStorage', Date.now());
	};

	// 該事件是核心
	window.addEventListener('storage', function(event) {
		if (event.key == 'getSessionStorage') {
			// 已存在的標籤頁會收到這個事件
			localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
			localStorage.removeItem('sessionStorage');

		} else if (event.key == 'sessionStorage' && !sessionStorage.length) {
			// 新開啓的標籤頁會收到這個事件
			var data = JSON.parse(event.newValue),
					value;

			for (key in data) {
				sessionStorage.setItem(key, data[key]);
			}
		}
	});
})();
發佈了42 篇原創文章 · 獲贊 22 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章