记一次由接口响应顺序导致的 bug

前言

业务中存在一个逻辑:

如果接口响应 401,就清空前端用户信息

貌似是一个很合理的逻辑,401 肯定是登录态有问题,当然需要清空登录态。

碰到问题

线上偶现部分页面业务逻辑异常,顺着业务梳理排查:

其他地方传过来 token,前端凭 token 调登录接口,拿到了登录态,存起来了,可突然转个身,登录态没了。。。

排查

检查代码逻辑没问题,检查现场请求发现,登录请求前面紧挨着有几个 401,请求时间比较长。

原来是:

  • 页面顺序发了几个请求: api: x + api: login
  • api: login 后发,但提前响应回来了,前端保存了登录态;
  • api: x 先发,发的时候没有登录态,但之后才响应 401,触发了 401 的逻辑,清空了刚刚保存的登录态。。。

修复

最合理的解决方案是:记录请求的发送时间,记录最后一次登录成功的时间,在触发 401 清空登录态时,判断请求发送时间是否早于登陆成功的时间,如果是,就忽略(不执行清空登录态)。但由于有历史包袱,改动过大,没法搞。

裱糊匠有办法:记录最后一次登录成功的时间 T,忽略 T + 1s 时间内的 401 清空登录态的调用。

什么,你说万一前面的请求超过 1s 了呢?2s 够不够?3s 够不够?

不够?那就只能牺牲我的头发,用上面那个难搞的方案咯。(你说 10s?你是真不让别人退出了呗。。。)

如非特别声明,本站作品均为原创,遵循【自由转载-保持署名-非商用-非衍生 创意共享 3.0 许可证】。

对于转载作品,如需二次转载,请遵循原作许可。