业务场景 : ? ? ? ?在业务中经常会遇到这种需求,用户登录后用户token是具有一定的时效性的,当token过期后怎样刷新token,且用户并不会感知到token已经刷新了呢,这个时候就需要我们在拦截器里面进行处理了。
实现方式:一般后台会定义一个token 一个refreshToken,当token失效后,利用refreshToken去请求获取新的token再刷新token;
关键代码: ? ? ? ? 首先定义一个TokenInterceptor继承至Interceptor,重写onResponse或者onError方法,具体看后台是怎么定义token失效规则的,如果后台自己定义了一套规则来判断token失效的话,重写onResponse即可,下面用它来说明:
首先将后台返回的数据解析出来
final String data = response.data.toString();
BaseResult baseResult =BaseResult.fromJson(json.decode(data));
然后根据解析得到的BaseResult后台返回的对应的code码进行判断,具体的规则根据后台制定的为准,假设401是失效状态 ?
if (baseResult.resultCode ==401) {
? ?//Todo token失效进行token刷新
}
//下面是刷新token的代码
if (baseResult.resultCode ==401) {
//获取全局的dio实例
Dio dio = DioUtil.instance().dio;
dio.lock();
var newToken = await getToken(refreshToken);
if(newToken.isNotEmpty){
//Todo进行token刷新的操作
}
dio.unlock();
}
Future?getToken(String refreshToken)async {
Options tokenOptions =Options();
String newToken="";
options.headers!["Authorization"] = refreshToken;
Dio tokenDio =Dio();
var response =await tokenDio.get("刷新token的请求地址",options: tokenOptions);
if (json.decode(response.data)["resultCode"] ==200) {
? ? ? ? // token重新赋值
? ??????newToken=json.decode(response.data)["data"]["refreshToken"];
????}
return newToken;
}
以上就是将token重新刷新的操作,可能还有需求就是说将token失效前的请求失败接口进行重新请求这个时候就需要我们拿到失败前的请求进行重新请求了:
?
try {
var request = response.requestOptions;
? Options options =Options();
? options.headers!["Authorization"] = newToken;
? var responses =await dio.request(
????request.path,
? ? data: request.data,
? ? queryParameters: request.queryParameters,
? ? cancelToken: request.cancelToken,
? ? options: options,
? ? onReceiveProgress: request.onReceiveProgress,
? );
? handler.next(responses);
return;
}on DioErrorcatch (e) {
handler.reject(e);
}
|