多标签页并发请求导致 Token 刷新失败?只有 15行代码就能解决 !
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
最近我们客服群里的告警反馈就炸了。 不少核心 SaaS 用户在抱怨:你们系统怎么回事?我开着几个标签页在后台对账,突然所有页面全部掉线,提示登录过期,害得我刚录入的数据全没了! 我立刻把负责用户中心模块的小伙子叫过来,一块排查后端日志🫡。 原因极其典型:用户在浏览器里开着 5 个我们的后台标签页,半小时后,Token 过期了。
5 个标签页在同一瞬间检测到了过期,同时向后端发起 而我们的后端为了安全,设计了 单次刷新令牌即失效(One-Time Use Token) 的安全机制。 当这 5 个并发请求几乎同时到达服务器时:
小伙子一脸委屈:老大,这纯粹是网络临界区冲突,前端发请求又没有跨页面同步机制,我怎么控制谁先发,谁后发?🤷♂️ 大部分中初级开发在面对这个痛点时,脑子里的常规套路是👇:
利用 代码动辄写上百行,不仅难以调试,还要处理页面卡死、 但在这个圈子混了快十年,我一向提倡的原则是:凡是能用一行原生 API 降维打击的,绝对不要在 JS 业务层去折腾复杂的轮子。 其实,现代浏览器早就为我们内置了一款低调、极其强大、却被 90% 前端忽略的冷门大杀器—— 接下来直接上真家伙,看看它是怎么用最纯粹的原生语法,优雅解决这个多标签页死结的👋。 先讲清楚,什么是 Web Locks API?很多前端知道线程锁、进程锁,但极少有人知道浏览器端也有 页面级互斥锁。
在锁被持有期间,其他任何标签页都无法获取同名的锁,必须老老实实排队。只有当持有锁的那个异步函数执行完毕( 只有 15 行代码解决多标签页并发刷新有了它,我们怎么去重构 不需要写任何跨页面通信,不需要写任何
核心伪源码👇: 你根本不需要知道别的标签页现在是个什么状态,你只需要把最核心的临界代码用 多标签页之间的并发冲突、时序排队,全部交由浏览器内核的 也要警惕锁死与超时灾难如果文章写到这里就结束,那就是纯粹的 API 爽文 了 😁。 在真实的工程环境里,只要涉及多线程/多端锁,就必然面临两个无法逃避的问题:死锁(Deadlock)与意外挂起。 如果持有锁的那个标签页,在执行异步请求时由于网络极其缓慢,卡了整整 30 秒,难道其他 4 个标签页要跟着卡死、拒绝响应用户 30 秒吗?😖 又或者,持有锁的标签页突然发生了崩溃,锁没有被正确释放怎么办?(这个不用担心,浏览器在标签页关闭或崩溃时,会在底层强行安全回收它持有的锁)。 为了防范 网络卡死 导致的所有页面陷入无尽等待,我们必须利用 利用 最后如果再次遇到多页面、多端并发的数据同步问题,别再本能地去 学会浏览器原生的底盘能力。用最克制、最优雅的一行 阅读原文 该文章在 2026/6/5 16:09:49 编辑过 |
关键字查询
相关文章
正在查询... |