【问题标题】:sessionStorage not cleaned when browser hangged浏览器挂起时未清理 sessionStorage
【发布时间】:2017-01-19 10:09:40
【问题描述】:

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

正常工作

  1. 用户打开应用程序。
  2. 闲置 30 分钟,然后点击任何链接
  3. 会话到期消息显示正常。
  4. 用户关闭窗口并启动新窗口,应用程序加载成功

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

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

【问题讨论】:

  • 通过在列表之前添加一个空行,您可以将其格式化为列表。此外,您还使用了哪些其他技术?你在说什么令牌?如果浏览器在这么长时间后挂起,则很可能还有其他问题。您在这里的实际问题是什么?看起来它工作正常,因为它自然只能在应用程序运行时删除数据。如果数据过期,它可能会读取数据并仅在读取时丢弃它,而不是主动监视 SessionStorage 中的过期内容。
  • 是的,应用程序正在运行(实际上它已经部署到我们的 UAT 环境中并且它一直处于运行状态)。我们将从服务器接收到的令牌存储到浏览器 sessionStorage 中(它在每种情况下都运行良好)。但是,如果用户在我的应用程序上的理想状态超过 5-6 小时,并且如果浏览器进入挂起状态,然后用户关闭该浏览器并打开一个新浏览器,则会出现会话过期消息。这意味着存在于先前打开的浏览器上的令牌,由新打开的浏览器共享。
  • 这就像 IE 浏览器在挂起并随后打开新浏览器时的默认行为,它将 sessionStorage 传递给另一个,以便用户有机会恢复以前的会话。
  • 我仍然不明白您的实际问题/问题是什么?我的假设是你想修复这种行为。您可以通过避免浏览器崩溃和/或主动强制删除该信息来做到这一点。这可以例如通过在 x 分钟后重新加载页面来完成。但如果浏览器在此之前崩溃,则不会修复它。
  • 我只想了解: 1. 如果我在 IE 中打开我的应用程序并将某些内容存储到 sessionStorage 中,并且 IE 窗口在某个时间后挂起。 2.然后我关闭它并在新窗口中重新打开它,是否可以在新窗口中使用?

标签: html web


【解决方案1】:

您对sessionStorage 工作原理的概念可能是错误的。根据您的问题:

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

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

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

没有机制可以在一段时间后为这种缓存设置过期时间。因此,我的假设是您已经在使用一种机制来主动跟踪该时间(例如Expiry of sessionStorage)。

您说浏览器是 Internet Explorer 的某个版本,但您没有详细说明配置或用户交互。所以我的假设是用户恢复崩溃的会话而不是重新打开页面。 Microsoft documentatoin 表示至少对于 IE 8,缓存应该被丢弃,但对于其他版本可能会有所不同。因此,您必须咨询 Microsoft,并可能向他们提出错误。另一方面,对于 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 一次删除所有项目。请记住,对本地存储区域的更改是异步保存到磁盘的。

【讨论】:

    【解决方案2】:

    我担心的是当浏览器崩溃时 sessionStorage 仍然存在。所以我正在研究可以清除我在下面的 sn-p 中实现的 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/

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2015-05-05
      • 2019-09-03
      相关资源
      最近更新 更多