2017-01-19 145 views
0

我已經建立了一個應用程序,其中我將從服務器接收到的令牌保存到客戶端的sessionStorage中。會議屆滿時間爲30分鐘。該應用程序的工作以及在給定的情景:sessionStorage沒有清理瀏覽器掛起

正常工作

  1. 用戶打開應用程序。
  2. 空閒30分鐘,然後單擊任何鏈接
  3. 會話過期消息顯示正常。
  4. 用戶關閉窗口,並啓動一個新的窗口,成功地應用laods

但是下面的情形無法正常工作考慮分配到一個新的窗口(不正確的行爲)的新的sessionStorage:

  1. 用戶打開應用程序。
  2. 待機5-6小時或過夜,也許
  3. 用戶回來第二天,並嘗試點擊陳舊的會議
  4. 瀏覽器掛起並沒有響應
  5. 用戶關閉窗口,並啓動一個新的窗口,應用程序顯示會話超時頁面。用戶必須刷新或重新啓動頁面。
+0

通過添加一個空行你列出之前,你可以將其格式化爲一個列表。另外您還使用了其他什麼技術?你在說什麼令牌?如果瀏覽器在很長時間之後掛起,很可能會有其他不妥之處。這裏你真正的問題是什麼?它看起來像它的工作正常,因爲它只能在應用程序運行時刪除數據。如果數據過期了,它可能會讀取數據並且只在讀取時丟棄數據,並且不會主動監視SessionStorage是否存在過期內容。 – Seth

+0

是的,應用程序正在運行(實際上它已被部署到我們的UAT環境中,並且始終處於轉儲狀態)。我們將從服務器接收到的令牌存儲到瀏覽器sessionStorage中(它在每種情況下運行良好)。但是,如果用戶對我的應用程序的理想時間超過5-6小時,並且瀏覽器進入掛起狀態,然後用戶關閉該瀏覽器並打開新瀏覽器,則會出現會話過期消息。這意味着在開放的瀏覽器上存在的令牌,由新開放的瀏覽器共享。 –

+0

這就像IE瀏覽器掛起並且新的瀏覽器打開後的defaullt行爲,它將sessionStorage傳遞給另一個,以便用戶可以獲得恢復先前會話的機會。 –

回答

0

我擔心的是當瀏覽器崩潰sessionStorage仍然存在。所以我一直在尋找到可以清除sessionStorage的修復,我有以下片斷實現:

window.addEventListener('load', function() { 
     sessionStorage.setItem('good_exit', 'pending'); 
     setInterval(function() { 
     sessionStorage.setItem('time_before_crash', new Date().toString()); 
     }, 1000); 
    }); 

    window.addEventListener('beforeunload', function() { 
     sessionStorage.setItem('good_exit', 'true'); 
    }); 

    if(sessionStorage.getItem('good_exit') && 
     sessionStorage.getItem('good_exit') !== 'true') { 
     /* 
     insert crash logging code here 
    */ 
     alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash')); 
    } 

佛細節,請參考以下鏈接: http://jasonjl.me/blog/2015/06/21/taking-action-on-browser-crashes/

0

您對sessionStorage如何工作的概念可能是錯誤的。從你的問題:

但是下面的情形無法正常工作考慮分配到一個新的窗口(不正確的行爲)的新的sessionStorage:

這可以被認爲是錯誤的行爲取決於如何在瀏覽器實際上實現它。從上面的MDN條目:

...存儲在sessionStorage中的數據在頁面會話結束時被清除。只要瀏覽器處於打開狀態並且在頁面重新加載和恢復時存在,頁面會話就會持續。在新選項卡或窗口中打開頁面將導致啓動新會話,這與會話cookie的工作方式不同。

對於那種緩存而言,沒有任何機制可以在一段時間之後擁有一個expiery。因此,我的假設是,您已經在使用一種機制來積極跟蹤那段時間(例如Expiry of sessionStorage)。

您說瀏覽器是Internet Explorer的某個版本,但您沒有詳細說明配置或用戶交互。所以我的假設是用戶恢復崩潰的會話,而不是重新打開頁面。 Microsoft documentatoin表示,至少對於IE 8應該放棄緩存,但對於其他版本可能會有所不同。所以你將不得不詢問微軟,並可能與他們打開一個錯誤。在另一方面與所述MDN文檔和official specificitons行爲是完全有效的:

一個瀏覽上下文的使用期限可以是無關的實際用戶代理過程本身的壽命,由於用戶代理可以支持恢復重新啓動後的會話。

如果您還有其他關於sessionStorage以及它如何實際工作的問題,您可以更好地瞭解它。有一個很好的問題,好的答案似乎如下:What is the difference between localStorage, sessionStorage, session and cookies?

現在爲您提出如何在崩潰的瀏覽器中處理它的問題:只有在瀏覽器沒有崩潰的情況下才能處理它。或者,您可以更改您的到期機制,以忽略比X年齡更早的會話,但這會爲您提供各種各樣的攻擊,因此無需詳細瞭解您在應用程序中實際做了什麼,該令牌包含什麼以及它的作用是什麼沒有太多可以提供的幫助。如果您在使用瀏覽器的機器的控制,你可以嘗試自動"Security and Privacy » Clearing the Storage Area"下什麼東西被詳細描述:

清除儲存區

會話狀態將立即被釋放的最後一個窗口來引用數據關閉了。但是,用戶可以隨時清除存儲區域,方法是從Internet Explorer的「工具」菜單中選擇「刪除瀏覽歷史記錄」,選中「Cookie」複選框,然後單擊「確定」。這將清除不在「收藏夾」文件夾中的所有域的會話和本地存儲區域,並重置註冊表中的存儲配額。清除「保留最喜歡的站點數據」複選框可刪除所有存儲區域,而不考慮源。

要從存儲列表中刪除鍵/值對,請使用removeItem迭代集合或使用清除一次刪除所有項目。請記住,對本地存儲區的更改將異步保存到磁盤。