我最先发现这个问题时,它的表现形式是一直调退出的接口,循环调,不带一下停的,分分钟几千次,而且页面也不带动一下的,点击退出也没用,退出接口返的也是401。只有手动清除cookie里面的token才会退出,那么为啥会出现这个问题呢,请看下面的原因分析
原因分析
有人一看401,好了,那不就是请求未授权吗,token过期了或者未登录,立马去质问后台了,可是后台把过期时间调长了,还是这样。再把里面的token拿去后台校验,并没有过期啊,那为啥一直死亡循环调退出接口。
前端对axios请求响应有一个统一的拦截,就是当你接口返回401的时候统一处理了,401的逻辑代码会把存储的一些本地数据移除,再调一次logout接口(这是因为要统计当前系统的在线人数,登录加1,退出减一),最后再回到登录页让用户重新登陆。这逻辑本来没啥问题,可问题就在401会调logout,而logout友返回的是401,401的返回又被响应拦截了,又去调logout,于是logout方法里面的就是逻辑代码根本就没执行,一直再调接口,如此恶心循环。
那么问题来了,我们token的时间足够长,他为啥没过期就被接口返回401了呢?这还得说说项目部署的一些问题,现在的系统一般都是接入很多第三方系统,而且部署项目采用较多的两种方式是虚拟机虚拟化部署,模拟多个ip,还有一种就是k8s容器化部署,容器化部署后项目可能会在同一个域名下,那么问题来了,同一个域名下的cookie那不就共享了,最致命的是如果存入cookie中的字段又一样,那么你依次登录两个系统,它存在cookie中的token不就被覆盖了吗,所以这就导致了你那一个系统的token去登陆另一个系统,于是这样就形成了一个原本token没过期,但是却拿到错的token去验证!
于是乎就出现了上面所描述的问题,后台懵逼,前端也非常懵逼,殊不知在cookie中的token巧无声息的被替换了!