flutter token 401 刷新逻辑

1,134 阅读1分钟

使用到的库

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) {
        //去登陆
      }
    });
  }

}

转载请说明