提问人:Garret Wilson 提问时间:8/31/2023 更新时间:8/31/2023 访问量:54
Firefox保存与导航历史记录关联的会话存储历史记录?
Firefox saving session storage history associated with navigation history?
问:
在 Windows 10 上,我有一个类似于以下内容的场景。想象一下,一个服务器接受 to ,它将生成一个 HTML 文件,其中包含 JavaScript 中嵌入的新随机数。JavaScript 将在 HTML 中动态显示数字,但它也将用于将随机数保存在会话存储中。这样,如果用户点击只是重新加载页面,JavaScript 将在会话存储中看到随机数,并继续在 HTML 中显示相同的数字。(该页面还用于允许使用 而不是 .它适用于各种浏览器。POST
/random
sessionStorage.setItem("random", randomNumberGeneratedFromServer)
GET
window.history.replaceState(null, null, window.location.href)
F5
GET
POST
现在,假设我们在同一页面上有一个“Regenerate”按钮,该按钮实际上将返回到 .这将导致生成相同的页面,但使用新的随机数。新页面也可以重新加载,它将使用 在会话存储中找到新的随机数并显示它。POST
/random
sessionStorage.getItem("random")
缺点是,使用重新生成页面会导致导航历史记录中出现一个新点。如果您点击“返回”按钮,它将显示上一页。不幸的是,导航中的上一页(实际上是具有相同 JavaScript 的同一页面)不会显示前一个随机数,因为当与 JavaScript 一起使用时,会在会话存储中查找随机数。由于会话存储变量在重新生成时被替换,因此当前页和上一页都将在会话存储中找到相同的编号。旧的随机数永远消失了。当前页面和上一页现在都将显示新的随机数。POST
GET
至少这是预期,这就是 Chrome 116.0.5845.141 中发生的事情。但是在 Firefox 117.0 中,当我点击“返回”按钮转到上一页时,它显示了旧的随机数!我甚至可以刷新上一页,它将显示旧的随机数。我可以向前导航,它将显示新的随机数!
由于这两个页面是相同的,并且在调用它们时会从会话存储中加载生成的随机数,因此我只能推断 Firefox 在导航历史记录中存储了具有不同点的不同会话值!这毫无意义,因为我认为会话存储独立于导航历史记录。GET
这是 Firefox 以某种方式存储与导航历史记录相关的会话存储快照的行为吗?
答:
经过进一步的实验,Firefox似乎实际上并没有保存与导航历史记录相关的会话存储历史记录。在Firefox中似乎正在发生的事情是,它显示了上一页的缓存版本,即 的结果,并运行了它的JavaScript。由于该版本包含嵌入在 JavaScript 中的旧随机数,这会导致页面将旧的随机数重新保存回会话状态。POST
POST
当我实际在Firefox中重新加载历史记录中的一个页面时(使用),这会“锁定”旧值,以便当我循环回到页面时,它会加载会话存储中的任何内容,而不是替换它(就像版本中缓存的JavaScript一样)。GET
POST
另一方面,Chrome 似乎没有使用缓存中的旧页面,而是实际发出一个新的 ,这导致旧页面按预期从会话存储中检索新的随机数。GET
因此,Firefox并没有保留会话存储的历史记录(哇!),但本质上是以一种偶然的“事件溯源”的方式重新创建会话存储历史记录,因为它在页面的缓存版本上运行JavaScript。
评论
<script>saveRandom('first-generated-on-the-server')</script>
GET
GET
POST
window.history.replaceState(null, null, window.location.href)
GET
GET
评论