GoLang 如何解决点击浏览器后退按钮时页面被缓存的问题
问题根因
你设置的缓存头没有生效,核心原因是浏览器的**往返缓存(Back/Forward Cache,简称bfcache)**优先级高于常规HTTP缓存规则,默认的Cache-Control: no-cache配置无法阻止浏览器将权限敏感页面存入bfcache,用户点击后退时会直接读取本地bfcache的页面内容,不会发起服务端请求,所以你的身份校验中间件不会被触发。
另外你使用的no-cache配置本身也不满足需求:no-cache的含义是允许浏览器存储缓存,但使用前必须向服务端验证缓存有效性,而非完全禁止存储缓存。
修正方案
1. 调整服务端响应头配置
将no-store和must-revalidate加入Cache-Control头,同时添加Vary头区分不同用户身份的缓存:
// 必须添加no-store完全禁止缓存存储,覆盖bfcache的默认规则 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate, private, max-age=0") w.Header().Set("Expires", time.Unix(0, 0).Format(http.TimeFormat)) w.Header().Set("Pragma", "no-cache") w.Header().Set("X-Accel-Expires", "0") // 告诉浏览器不同Cookie/授权身份的用户不能共享同一份页面缓存 w.Header().Set("Vary", "Cookie, Authorization")
注意:上述响应头必须添加在返回管理员Dashboard HTML页面的响应中,而非仅添加在接口响应里。
2. 前端兜底校验
对于兼容性要求高的场景,可在所有权限敏感页面添加pageshow事件监听,页面加载(包括从bfcache恢复)时主动校验用户权限:
window.addEventListener('pageshow', function(event) { // 校验当前用户是否有权限访问当前页面 fetch('/api/auth/verify', { credentials: 'include' }).then(res => { if (res.status === 401) { window.location.replace('/unauthorized'); } }) })
内容的提问来源于stack exchange,提问作者Stefan Radonjic
相关产品推荐
相关产品推荐

