记录一次协商缓存导致的token续期的 bug

这个问题的起因是过年前非得要求给系统加个 Token 续期的功能,不加还不高兴,得,没办法,看来只有我不高兴了,反正闲着也是闲着,加呗。

背景

我们采用的 Token 续期方案是每次请求接口时会验证 Token 是否要过期了,如果要过期了后端则会将替换为新的 Token 在 Header 上返回来,前端发现请求中有这个请求头则会替换为新的 Token。

问题

果然,人还是不要太闲。

年后,我还在请假中,测试同学突然说,急急急,你这 Token 续期有问题哇,老用着用着就报登录超时错误打到登录页面去了,而且只要出现过一次,每次登录进入这个页面就会出现登录超时的问题了。

什么情况?飞来一锅,我年前自测这么多次都没问题,你一用就有问题?人品问题???

然后,我嫩是没有复现出来。

A few later...

忙活了大早上,从测试同学浏览器发现,咦,咋到报错那个接口 Token 就变了哇,哪儿来的 Token。后面才发现是协商缓存的问题。

什么是协商缓存

额,懒得写了。

总结来说就是,浏览器请求服务器时会附带资源标识,如果资源更新了,服务器会带上新的资源返回 200,如果资源没有更新,则会返回 304,浏览器读取缓存资源。

问题原因

问题的关键就是出在浏览器读取缓存资源这儿,你资源读缓存,Header 咋还用缓存哇。没错,浏览器 Header 它也用了缓存,假如有个接口头上戴了一个老的 Token(假设是 2024/2/22 10:00颁发的),然后刚好被缓存了,后面假如资源没有变化的话每次这个接口请求过后 Token 都会被换成老的 Token。哭。

至于为啥我自测没发现呢,因为我每次自测都是打开控制台且禁止缓存的。。。(这个习惯不好。。得改)

解决方案

知道了问题的原因解决起来就简单了。下面是几种解决方案:

  1. 接口不允许缓存,前端请求头加 cache-control: no-cache
  2. 与后端约定新的 Token 不放在 Header 上,使用一个状态码标记,然后放在响应体里面。
相关推荐
摸鱼的春哥30 分钟前
惊!黑客靠AI把墨西哥政府打穿了,海量数据被黑
前端·javascript·后端
小兵张健33 分钟前
Playwright MCP 截图标注方案调研(推荐方案1)
前端·javascript·github
小兵张健1 小时前
AI 页面与交互迁移流程参考
前端·ai编程·mcp
小兵张健2 小时前
掘金发布 SOP(Codex + Playwright MCP + Edge)
前端·mcp
小兵张健2 小时前
Mac 上 Antigravity 无法调用 browser_subagent?一次 400 报错排查记录
前端
张拭心3 小时前
编程最强的模型,竟然变成了国产的它
前端·ai编程
爱勇宝3 小时前
2026一人公司生存指南:用AI大模型,90天跑出你的第一条现金流
前端·后端·架构
fe小陈3 小时前
简单高效的状态管理方案:Hox + ahooks
前端
我叫黑大帅3 小时前
Vue3和Uniapp的爱恨情仇:小白也能懂的跨端秘籍
前端·javascript·vue.js
Panzer_Jack3 小时前
如何用 WebGL 去实现一个选取色彩背景图片透明化小工具 - Pick Alpha
前端·webgl