记录一次协商缓存导致的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 上,使用一个状态码标记,然后放在响应体里面。
相关推荐
醉挽清风78311 小时前
Vue+Djiango基础用法
前端·javascript·vue.js
dreams_dream12 小时前
vue2动态更改css属性方法大全
前端·css
阿基米东12 小时前
Caddy:把 HTTPS 变成默认选项的现代 Web 服务器
服务器·前端·https
洞窝技术12 小时前
从原理到落地:大屏适配适配 + 高并发弹幕的企业级技术手册
前端·css
IT_陈寒12 小时前
JavaScript性能优化:5个V8引擎隐藏技巧让你的代码提速50%
前端·人工智能·后端
菠菜盼娣12 小时前
第三方插件 unplugin-icons
前端
敲代码的彭于晏12 小时前
在迁移中学习 React 18:一份来自 React 17 的升级问题清单
前端·react.js
顾安r12 小时前
12.17 脚本工具 自动化全局跳转
linux·前端·css·golang·html
踢球的打工仔12 小时前
jquery的基本使用(2)
前端·javascript·jquery
DEMO派12 小时前
前端javascript如何实现阅读位置记忆【可运行源码】
前端