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

Firefox saving session storage history associated with navigation history?

提问人:Garret Wilson 提问时间:8/31/2023 更新时间:8/31/2023 访问量:54

问:

在 Windows 10 上,我有一个类似于以下内容的场景。想象一下,一个服务器接受 to ,它将生成一个 HTML 文件,其中包含 JavaScript 中嵌入的新随机数。JavaScript 将在 HTML 中动态显示数字,但它也将用于将随机数保存在会话存储中。这样,如果用户点击只是重新加载页面,JavaScript 将在会话存储中看到随机数,并继续在 HTML 中显示相同的数字。(该页面还用于允许使用 而不是 .它适用于各种浏览器。POST/randomsessionStorage.setItem("random", randomNumberGeneratedFromServer)GETwindow.history.replaceState(null, null, window.location.href)F5GETPOST

现在,假设我们在同一页面上有一个“Regenerate”按钮,该按钮实际上将返回到 .这将导致生成相同的页面,但使用新的随机数。新页面也可以重新加载,它将使用 在会话存储中找到新的随机数并显示它。POST/randomsessionStorage.getItem("random")

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

至少这是预期,这就是 Chrome 116.0.5845.141 中发生的事情。但是在 Firefox 117.0 中,当我点击“返回”按钮转到上一页时,它显示了旧的随机数!我甚至可以刷新上一页,它将显示旧的随机数。我可以向前导航,它将显示新的随机数!

由于这两个页面是相同的,并且在调用它们时会从会话存储中加载生成的随机数,因此我只能推断 Firefox 在导航历史记录中存储了具有不同点的不同会话值!这毫无意义,因为我认为会话存储独立于导航历史记录。GET

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

javascript html firefox 浏览器-历史 会话-存储

评论

0赞 myf 8/31/2023
你肯定JS真的在Firefox中的history.back之后运行吗?您描述的症状可以解释为浏览器仅使用 BFcache 并显示以前呈现的“静态”状态,而不运行 JS。我想如果 JS 运行,(JS) sessionStorage 将包含该新值。您是否通过控制台检查了其状态?
0赞 myf 8/31/2023
(另外,也许可以重新考虑您的假设:当您使用“返回历史记录”浏览器功能时,您真正希望在屏幕上看到什么?您是否希望看到页面处于您离开页面时的状态?或者你希望看到一些不同的东西,从技术上讲,甚至是以前从未展示过的东西?
0赞 Garret Wilson 8/31/2023
我还认为我可能只是看到页面的缓存呈现,而没有运行 JavaScript。但是,我会重新加载页面,它仍然会显示旧的随机数!但我想我已经弄清楚发生了什么,幸运的是,这看起来不是会话存储保存在历史记录中的结果。看看我的答案。

答:

0赞 Garret Wilson 8/31/2023 #1

经过进一步的实验,Firefox似乎实际上并没有保存与导航历史记录相关的会话存储历史记录。在Firefox中似乎正在发生的事情是,它显示了上一页的缓存版本,即 的结果,并运行了它的JavaScript。由于该版本包含嵌入在 JavaScript 中的旧随机数,这会导致页面将旧的随机数重新保存回会话状态。POSTPOST

当我实际在Firefox中重新加载历史记录中的一个页面时(使用),这会“锁定”旧值,以便当我循环回到页面时,它会加载会话存储中的任何内容,而不是替换它(就像版本中缓存的JavaScript一样)。GETPOST

另一方面,Chrome 似乎没有使用缓存中的旧页面,而是实际发出一个新的 ,这导致旧页面按预期从会话存储中检索新的随机数。GET

因此,Firefox并没有保留会话存储的历史记录(哇!),但本质上是以一种偶然的“事件溯源”的方式重新创建会话存储历史记录,因为它在页面的缓存版本上运行JavaScript。

评论

0赞 myf 8/31/2023
这听起来很有道理。如果 HTML 服务器响应包含 sth,则它将保留在前退缓存中,因此在下次评估时重新保存。您应该在 devtools 网络选项卡的 “Transferred” 列中查看 bowser 是否发出真实的网络请求(确保 “Disable cache” 打开)。(或在服务器的日志中)。<script>saveRandom('first-generated-on-the-server')</script>
1赞 Garret Wilson 8/31/2023
是的,这正是我所做的。写完问题后,我记得在开发工具中查看网络活动,这时我看到Firefox在历史上使用了缓存版本。(请注意,它说即使历史上它从来都不是 a 而是 ,但如前所述,我曾经使用过,所以我想这使得 Firefox 将其存储在历史记录中)。无论如何,Firefox似乎一直在使用缓存版本,而Chrome实际上正在发布新的.我可能曾经在 Chrome 中关闭了缓存。GETGETPOSTwindow.history.replaceState(null, null, window.location.href)GETGET