手机App用着用着弹出登录已过期,再点一下又好了,用户一脸问号来投诉。这种提示说的不是账号出问题,而是那张临时通行证到期了,拿旧票进不了门,换新票就通行。

这句话到底在说什么

登录成功后服务端发一张带有效期的凭证,客户端每次请求带上它。服务端解码时会比对当前时间和凭证里的过期时间,超了就用这句拒绝。重点在对时间差敏感:客户端时钟不准、跨时区、服务端时间没同步,都会让本来正常的票被判过期。所以排查先看两端时间差,往往一眼就发现问题。

三种过期场景对号入座

一是闲置太久,比如停留半小时没操作,票自然到期,这是正常设计。二是有效期设得太短,比如只给五分钟,用户看个列表就掉了,体验差。三是刷新机制没做好,本该用长期刷新票换新票,结果刷新票也过期了,只能重新登录。分清哪种,改法完全不同,别一律怪用户网络差。

客户端该怎么兜住

收到这个错误先别急着弹登录框,试着用刷新票静默换一张新的,成功就重发原请求,用户无感。多个请求同时失败会并发刷新,做一层锁,只让第一个去换,后面等结果复用。刷新也失败才是真过期,清掉本地凭证跳登录页。请求拦截器里统一处理这类错误最省事,别在每个页面写一遍判断。

服务端与运维要注意的

有效期别设太短也别太长,常用做法是访问票两小时、刷新票两周。密钥轮换后老票会全部失效,高峰期别换密钥,会瞬间把所有人踢下线。集群里各节点时间要同步,差几秒都可能让校验偶发失败,时快时慢最难查。多端登录同一账号时,记得区分不同设备的票,别退登一台就把全部踢掉。

  • 先查时钟:两端时间差是最高频原因,先排除这一条
  • 静默刷新:能用刷新票换新票就别弹登录框,并加锁防并发
  • 运维禁忌:业务高峰别轮换密钥,会让全部凭证同时失效
拦截器捕获过期错误先调用刷新接口换取新凭证刷新成功则重发原请求失败则清除本地凭证跳登录刷新调用加锁 避免并发重复刷新