問題:項目使用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]);
}
}
});
})();