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

来源:8-2 -2 拦截器的设计与实现 - 拦截器管理类实现

网络首席管理监察官

2020-09-15

老师你好,我们项目使用的是被动刷新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

写回答

1回答

ustbhuangyi

2020-09-15

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

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

0
3
网络首席管理监察官
回复
ustbhuangyi
明白了,感谢老师,看来axios本身做不到在拦截器处理重发并返回数据这件事,我这就给项目的请求方法都做一下重发请求
2020-09-17
共3条回复

下一代前端开发语言 TypeScript从零重构axios

课程从零开始重构功能完整的JS库,是学习造轮子的不二之选!

2629 学习 · 877 问题

查看课程