You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:48:00