记录一次协商缓存导致的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 上,使用一个状态码标记,然后放在响应体里面。
相关推荐
百度一下吧23 分钟前
HTML5 新增标签与 Web Components 使用指南
前端·html·html5
志尊宝31 分钟前
Vue3 零基础每日笔记(081):富文本编辑器集成 wangEditor 5——封装
前端·javascript·vue.js·笔记·信息可视化·echarts
deli0071 小时前
纯向量检索漏掉的召回,BM25 加向量混合能补回来吗?5 组实测
前端
志尊宝1 小时前
Vue3 零基础每日笔记(080):Vue3 + ECharts 数据可视化——封装可复用图表组件
前端·javascript·vue.js·笔记·信息可视化·echarts
阿狗童鞋1 小时前
前端工程化实战指南
前端
CappuccinoRose1 小时前
CSS 动效基础
前端·css·动画·animation·transition
用户4402818278071 小时前
我用 TRAE 一晚上从零撸了个微信投票小程序: 17 个云函数 + 11 个页面的全链路实战
前端
BullSmall1 小时前
SonarQube 9.9.8-community 适配 Jenkins 版本说明
java·前端·jenkins
tryCbest1 小时前
第一篇:HTML5 核心知识全解 + 项目起步
前端·html·html5
百度一下吧1 小时前
CSS 伪类使用与实践:从入门到进阶
前端·css