window.addEventListener('pageshow', (e) => {
  if (e.persisted) location.reload();
});
// 退出时用 location.replace('/')

点了退出登录回到首页,按一下浏览器后退,账户页完整显示出来,订单号和个人信息都在,刷新一下才跳回登录页。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:页面被放进了前进后退缓存,恢复时不会重新发请求,服务端那层登录校验根本没跑到。只加 Cache-Control 也管不住 bfcache,它连 DOM 状态一起留着。

「bfcache 退出登录」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:退出时用 location.replace 跳转,别在历史栈里留账户页;监听 pageshow,persisted 为真时主动刷新一次;账户类页面响应头加 no-store,减少被整体缓存的机会;退出后连按两次后退,确认不会再看到数据。

确认没问题再收工,退出后按后退直接落在登录页,看不到任何账户内容。

作者 9823189