返回知识中心
平台

Back-Forward Cache 的生命周期、隐私与状态一致性

了解浏览器如何恢复后退前进缓存页面、哪些生命周期事件值得监听,以及如何保护隐私状态而不破坏导航体验。

BotBrowser Team

文档中心

想直接进入 平台 文档吗?

这篇文章属于博客内容库。若你要步骤化配置、参考说明和持续更新,请直接进入对应 docs 分区。

Back-Forward Cache(BFCache)让浏览器在后退或前进时几乎立即恢复之前访问的页面。恢复的文档可能包含 DOM、JavaScript 堆、表单值和内存中的应用状态,因此它不是普通刷新。WHATWG HTML 规范定义历史遍历模型,MDN 的 BFCache 说明介绍资格和 pageshow、pagehide 事件。W3C Page Visibility 规范定义与 BFCache 配合使用的可见性信号;可见性是生命周期证据,但不能证明文档一定进入了缓存。BotBrowser 可在隔离的 BrowserContext 中运行获授权的生命周期测试,但不能强制页面进入 BFCache、改变浏览器驱逐决定或替应用决定保留什么。

浏览器历史让页面从活动状态进入缓存再恢复,隐私检查贯穿每次转换

TL;DR

  • BFCache 恢复已有文档而不是普通刷新,pageshow 与 pagehide 是关键观察点。
  • 可见性、恢复、认证和服务端新鲜度必须分别验证。
  • BotBrowser 可以重复授权的生命周期夹具,但不能强制进入缓存或保证恢复。

Contents

要设计的生命周期

文档进入缓存时,pagehide 可能报告 event.persisted === true;返回时 pageshow 也会报告该值。它们是可移植的观察点;load 不会再次执行,框架组件可能仍保留旧内存。visibilitychange 适合保存工作,但不能证明页面进入了 BFCache。页面进入缓存时暂停计时器、轮询、媒体和昂贵观察器,在 pageshow 中恢复并重新检查可能变化的数据。让清理操作幂等,因为页面也可能被驱逐或直接关闭。

隐私是状态边界

BFCache 是浏览器进程内的状态,不是服务端会话。恢复的页面仍可能显示私密面板、草稿或表单值。不要仅因页面短暂存在就把秘密放入 URL、DOM 属性或长期 JavaScript 对象。pageshow 时重新验证认证和账户边界;会话失效就清除账户内存并显示登录状态。退出登录应先撤销服务端会话,再清理客户端状态。Cache-Control: no-store 可以阻止某些文档缓存,但不是通用隐私删除器;应在目标浏览器版本中验证。嵌入的其他来源拥有自己的存储和会话。

恢复后的状态一致性

常见错误是把恢复的文档当成最新数据。pageshow 时比较版本、账户标识或新鲜度令牌,只重新验证可能变化的部分。连接 WebSocket 或事件流前先释放旧连接,service worker 与 shared worker 也有独立生命周期。测试同标签页后退/前进、跨来源导航、另一标签页切换账户、会话撤销、记录变化和不符合 BFCache 的导航。恢复页面不能重复提交表单、重复购买或泄露前一账户数据。

BotBrowser 的有界能力

BotBrowser 提供隔离 BrowserContext 和可重复的浏览器配置,用于获授权的生命周期与隐私测试。团队可以在两个上下文中导航、撤销合成会话并检查 pageshow/pagehide,而 Cookie 和存储不会混用。BotBrowser 不绕过来源策略、不保证 BFCache 资格、不解决交互挑战、不使网站服务端会话失效,也不删除上下文之外的记录。记录浏览器版本、操作系统、代理和网站策略,因为它们都会影响结果。

检查清单

  1. 观察 pagehide、pageshow,把 persisted 当作信号而不是保证。
  2. 成对暂停和恢复计时器、媒体、套接字和观察器,避免重复实例。
  3. 显示私密状态前重新检查认证、账户和数据新鲜度。
  4. 覆盖会话撤销、账户切换、记录变化和非 BFCache 导航。
  5. 将浏览器恢复与服务端注销、数据删除分别报告。

BFCache 是性能功能,也带来生命周期责任。把每次恢复当成新的验证点,才能同时保持快速导航和隐私边界。

延伸阅读

结论

把恢复的文档当作新的验证点:安全暂停工作,重新检查认证和数据新鲜度,并将浏览器观察与服务端决定分开。

来源

#BFCache#隐私#页面生命周期#浏览器状态

让 BotBrowser 从研究走向生产

先用这些指南理解模型,再进入跨平台验证、隔离上下文和面向规模化的浏览器部署。