在浏览器挂起时,sessionStorage未清除

时间:2017-01-19 10:09:40

标签: html5 web

我已经构建了一个应用程序,其中我将从服务器接收的令牌保存到客户端的sessionStorage中。会话到期时间为30mnts。该应用程序在给定方案中运行良好:

正常工作

  1. 用户打开应用程序。
  2. 闲置30分钟,然后点击任何链接
  3. 会话过期消息显示正常。
  4. 用户关闭窗口并启动一个新窗口,应用程序成功完成
  5. 但是,以下方案无法正常考虑分配给新窗口的新sessionStorage(行为不正确):

    1. 用户打开应用程序。
    2. 闲置5-6小时或可能过夜
    3. 用户第二天回来并尝试点击陈旧的会话
    4. 浏览器挂机且无响应
    5. 用户关闭窗口并启动新窗口,应用程序显示会话超时页面。用户必须刷新或重新启动页面。

2 个答案:

答案 0 :(得分:0)

关于sessionStorage如何运作的概念可能是错误的。从你的问题:

  

但是,以下方案无法正常考虑分配给新窗口的新sessionStorage(行为不正确):

这可能被认为是错误的行为,具体取决于浏览器实际实现它的方式。从上面的MDN条目:

  

...页面会话结束时,sessionStorage中存储的数据将被清除。只要浏览器处于打开状态,页面会话就会持续,并且会在页面重新加载和恢复后继续存在。在新选项卡或窗口中打开页面将导致启动新会话,这与会话cookie的工作方式不同。

在这种缓存的一段时间之后,没有机制可以使用。因此,我的假设是您已经在使用一种机制来主动跟踪该时间(例如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迭代集合,或使用clear立即删除所有项目。请记住,对本地存储区域的更改将异步保存到磁盘。

答案 1 :(得分: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/