Back-Forward Cache 的生命周期、隐私与状态一致性
了解浏览器如何恢复后退前进缓存页面、哪些生命周期事件值得监听,以及如何保护隐私状态而不破坏导航体验。
BotBrowser Team
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 资格、不解决交互挑战、不使网站服务端会话失效,也不删除上下文之外的记录。记录浏览器版本、操作系统、代理和网站策略,因为它们都会影响结果。
检查清单
- 观察
pagehide、pageshow,把persisted当作信号而不是保证。 - 成对暂停和恢复计时器、媒体、套接字和观察器,避免重复实例。
- 显示私密状态前重新检查认证、账户和数据新鲜度。
- 覆盖会话撤销、账户切换、记录变化和非 BFCache 导航。
- 将浏览器恢复与服务端注销、数据删除分别报告。
BFCache 是性能功能,也带来生命周期责任。把每次恢复当成新的验证点,才能同时保持快速导航和隐私边界。
延伸阅读
结论
把恢复的文档当作新的验证点:安全暂停工作,重新检查认证和数据新鲜度,并将浏览器观察与服务端决定分开。