使用到的库
dio: ^4.0.0
synchronized: ^3.0.0
具体代码
import 'package:dio/dio.dart';
import 'package:synchronized/synchronized.dart' as synchronized;
var lock = new synchronized.Lock();
class TokenInterceptor extends InterceptorsWrapper {
@override
onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
return handler.next(options);
}
@override
onResponse(Response response, ResponseInterceptorHandler handler) async {
return handler.next(response); // continue
}
@override
onError(error, handler) async {
//刷新token逻辑如下:
if (error.response?.statusCode == 401) {
//获取dio
Dio _dio = DioManager().dio;
_dio.lock();
_dio.interceptors.requestLock.lock();
_dio.interceptors.responseLock.lock();
var options = error.response!.requestOptions;
//关键是这里,阻塞,并刷新token
await refreshToken();
_dio.unlock();
_dio.interceptors.responseLock.unlock();
_dio.interceptors.errorLock.unlock();
if(新token != null){
options.headers['Authorization'] = //设置你的新token到请求头中
_dio.fetch(options).then(
(r) => handler.resolve(r),
onError: (e) {
handler.reject(e);
},
);
} else {
handler.next(error);
}
} else {
handler.next(error);
}
}
refreshToken() async{
Log.i('token过期了');
await lock.synchronized(() async {
//创建刷新token Dio实例
Dio tokenDio = new Dio();
//参数
Map<String, dynamic> map = Map();
try {
//refreshToken url
String url = ‘refreshToken url’
var response = await tokenDio.get(url, queryParameters: map); //请求refreshToken刷新的接口
Log.i(response);
int ret = response.data["ret"];
if (ret == 0) {
//保存你的新token
} else {
//去登陆
}
} on DioError catch (e) {
//去登陆
}
});
}
}
转载请说明