请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

想问下Axios拦截器使用方面的几个问题

老师你好,我们项目使用的是被动刷新token,过程是:
1、token生命周期为30分钟或其他时间
2、生命周期由后台维护不对前端开放
3、前端带token请求时,如果token有效,则后台会把这个token的生命周期重新刷新为一个完整生命周期(比如剩余有效生命周期重新回到30分钟)
4、刷新的token的方法只会发生在:前端在某个请求提示过期后,才刷新 token 接口换取新token。
5、获取新token后再把之前过期的业务请求再重新发一次

这第4、5点,我前端会有两个操作不知道怎么处理:
1、由于同一个页面会发多个接口,请求回调发现过期后,已经发出的几个接口肯定也会报过期,我在换取token后,再次发送请求这个动作容易做到(比如把所有回调过期的请求的config放进数组里,等刷新接口回调成功后,去循环请求这个数组)。但是问题在于,循环重发请求后,我如何做到在这次循环请求过程中,一对一的把成功回调来的response数据再返回给上次过期时对应的业务请求呢?毕竟这次请求动作是我通过拦截器操作的,不是由业务接口发起的。(axios的use方法是针对每个请求的,我在这次请求完成后如何把第二次的请求数据返回给对应的use呢?)

2、还有一点是我思考的,我看APP端可以做到在某次请求拦截里阻塞剩余的请求,前端是否能做到呢,假如后台也给了token的生命周期给我前端,我在请求拦截器里请求判断时间已经过期,这时候即使我主动刷新token,依旧会存在一个页面多个请求,导致我重新发起的请求无法返回数据给上一次的对应请求。那么是否能做到,发现时间过期后,直接在请求拦截器中,阻塞住剩余的请求呢?

这个问题困扰我很久了,希望老师能点拨我一下,实在是找不到解决方案了,万分感谢QAQ

正在回答 回答被采纳积分+3

1回答

ustbhuangyi 2020-09-15 21:54:14

你可以写一个响应拦截器,如果返回的数据命中一个错误码(需要更新 token),这个响应肯定也会带新的 token,那么就携带这个新的 token 再次发送这个请求,这样业务那边是无感知的,也不需要改任何代码,只需要给请求添加这个拦截器就好了。

如果你不会写这个拦截器,可以参考这个重试的拦截器源码  https://github.com/softonic/axios-retry

0 回复 有任何疑惑可以回复我~
  • 老师你好,抱歉我第四步我没表述清楚,刷新后的新token不是跟着业务请求的过期状态回调一起反过来,是业务回调code码为过期后,我自己调用专门的刷新token的接口去获取新token,也就是说我接口请求过期后,不仅要调用刷新接口等待刷新成功,还要在刷新成功后,把这段时间所有过期了的业务请求全部重新发送一次。重发我能做到,可是重发后把服务器回调的数据在响应拦截器里,一对一返回给对应的业务方法,我就不知道怎么做了。特别是一个页面多个请求的情况下
    回复 有任何疑惑可以回复我~ 2020-09-16 14:25:46
  • 已经发过请求的为啥还需要重新发,触发时机应该就是你在发送某个请求的时候,发现 token 过期,如果不随着接口下发新 token,你还是在响应式拦截器去发请求获取新 token,然后重发这个请求即可。我认为不需要去管其他的请求了。
    回复 有任何疑惑可以回复我~ 2020-09-16 17:56:58
  • 明白了,感谢老师,看来axios本身做不到在拦截器处理重发并返回数据这件事,我这就给项目的请求方法都做一下重发请求
    回复 有任何疑惑可以回复我~ 2020-09-17 13:35:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信