Firefox 保存与导航历史记录相关的会话存储历史记录?

问题描述 投票:0回答:1

在 Windows 10 上,我有一个类似于以下的场景。想象一下,一个服务器接受

POST
/random
,它将生成一个 HTML 文件,其中嵌入了 JavaScript 中的新随机数。 JavaScript 将动态显示 HTML 中的数字,但它也会使用
sessionStorage.setItem("random", randomNumberGeneratedFromServer)
将随机数保存在会话存储中。这样,如果用户点击
GET
只是重新加载页面,JavaScript 将在会话存储中看到随机数,并继续在 HTML 中显示相同的数字。 (该页面还使用
window.history.replaceState(null, null, window.location.href)
来允许
F5
使用
GET
而不是
POST
重新加载页面。)它可以跨浏览器工作。

现在假设我们在同一页面上有一个“重新生成”按钮,它实际上将

POST
发送回
/random
。这将导致生成相同的页面,但具有新的随机数。新页面也可以重新加载,它会使用 sessionStorage.getItem("random") 在会话存储中找到
new
随机数,并显示它。

缺点是使用

POST
重新生成页面会导致导航历史记录中出现一个新点。如果您点击“后退”按钮,它将显示上一页。不幸的是,导航中的前一个页面(实际上是具有相同 JavaScript 的同一页面)不会显示之前的随机数,因为当与
GET
一起使用时,JavaScript 会在会话存储中查找随机数。由于会话存储变量在重新生成时被替换,因此当前页面和前一页都会在会话存储中找到相同的编号。旧的随机数永远消失了。当前页面和上一页现在都会显示新的随机数。

至少这是我们的期望,这就是 Chrome 116.0.5845.141 中发生的情况。但在 Firefox 117.0 中,当我点击“后退”按钮转到上一页时,它显示旧的随机数!我什至可以刷新上一页,它会显示旧的随机数。我可以向前导航,它将显示新的随机数!

由于两个页面是相同的,并且当使用

GET
调用时,它们会从会话存储中加载生成的随机数,因此我只能推断 Firefox 在导航历史记录中的不同点存储不同的会话值!这是没有意义的,因为我知道会话存储独立于导航历史记录。

记录下来的 Firefox 行为是否以某种方式存储与导航历史记录相关的会话存储快照?

javascript html firefox browser-history session-storage
1个回答
0
投票

经过进一步的实验,Firefox 似乎并没有真正保存与导航历史记录相关的会话存储历史记录。 Firefox 中似乎发生的情况是,它显示了上一页的缓存版本(

POST
的结果),并运行其 JavaScript。由于
POST
版本包含嵌入在 JavaScript 中的旧随机数,这会导致页面将旧随机数重新保存回会话状态。

当我实际在 Firefox 中重新加载历史页面之一时(使用

GET
),这会“锁定”旧值,这样当我循环回到该页面时,它会加载会话存储中的所有内容,而不是替换它(正如
POST
版本中缓存的 JavaScript 所做的那样)。

另一方面,Chrome 似乎没有使用缓存中的旧页面,而是实际发出一个新的

GET

,这导致旧页面按预期从会话存储中检索 
new 随机数。

Firefox 因此不会保留会话存储的历史记录(哇!),但本质上是

重新创建会话存储历史记录,有点像意外的“事件源”,因为它在页面的缓存版本上运行 JavaScript。

© www.soinside.com 2019 - 2024. All rights reserved.