一次被Chrome“坑“了的奇怪登出bug解决

问题发现

我在调试一个功能时,发现总会莫名其妙的退出,但是后台并没有打印任何主动登出的日志。于是我问前端的同事是怎么回事,结果前端的同事也说并没有主动执行任何登出操作。
这个问题存活了一晚上+一上午。

解决过程

  1. 首先在后台注释了所有主动登出的代码,没有解决这个问题
  2. 更换浏览器,发现火狐和ie和edge浏览器,都没有此问题
  3. 我们发现更前版本(我们产品的版本)的也有此问题,但是没有人提出这个bug
  4. 在前端追踪代码发现是因为local storage被清空,导致进入index页面时获取不到已存储的用户token,从而登出。但是我们在所有会清空local storage的地方都加入了console.log(),都没有输出,从而我们认为并没有任何代码清空local storage
  5. 我们发现在判断语句为false时,依然能够进入if判断,但这个问题并没有解决当前这个问题
  6. 我们发现,local storage中存储的三条信息,只有两条被清空,另外一条没有任何清空的代码,而我们在多个地方的某种触发条件下,会清空另外两条信息。但是鉴于console.log()无效,我们使用alert()
  7. 我们发现在一个异常处有一个alter弹出
    一次被Chrome“坑“了的奇怪登出bug解决
  8. 我们在alert的地方添加短点,发现所有的登出前的请求都被浏览器cancel掉了,没有发出去,从而导致代码捕捉到了这个异常,清空了local storage中的两条信息
  9. 于是在网上搜索此问题一次被Chrome“坑“了的奇怪登出bug解决
  10. 最终确定这是chrome浏览器的一个bug,以下是Stack Overflow上的解答一次被Chrome“坑“了的奇怪登出bug解决
    这段话的翻译是:我们发现了一个很相似的问题就是chrome会取消请求,当用frames或者iframes来加载东西时,这个现象好像跟计算机的网络连接速度有关系。
  • 结论
    • chrome会在页面路由跳转的时候,abort所有正在进行的request
    • 如果在abort线程触发之前,request成功结束,则成功跳转
    • 如果在abort线程触发之后,request还没结束,那么abort线程将会终结这个request
    • 由于后台添加了很多接口,访问量增大,接口的返回速度变慢,所以大部分情况会是,在abort线程触发之后,还没有完成跳转。
    • 同时并行线程的先后完成顺序不可控,所依点击home按钮返回index页面,会不规律并 且大部分情况下,直接登出

所以,要注意chrome的abort机制,和js在判断语句为false时,依然能够进入true逻辑的问题