前言:

之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有“token验证过期”的需求,所以接下来我简单总结一下在Flutter项目中如何实现自动刷新token并重发请求的拦截器功能,希望对大家有所帮助。

思路:

1.Dio实现网络请求

2.自定义token拦截器,实现token自动刷新并重发请求

3.EventBus发送登录失效事件,弹出登录页面

实现的步骤:

1.配置Android目录的gradle依赖

dependencies {

...

implementation 'de.greenrobot:eventbus:3.0.0-beta1'

}

2.在pubspec.yaml添加sdk

dependencies:

...

cupertino_icons: ^0.1.0

dio: ^2.1.2

event_bus: ^1.0.0

3.封装一个获取新的accessToken方法

Future getToken() async {

String accessToken = DataUtil.getAccessToken; //获取当前的accessToken

String refreshToken = DataUtil.getRefreshToken; //获取当前的refreshToken

Dio dio =DioUtil.getInstance().tokenDio; 创建新Dio实例

dio.options.headers['x-access-token'] = accessToken;//设置当前的accessToken

try {

String url = url; //refreshToken url

var response = await dio.get(url,options: options); //请求refreshToken刷新的接口

accessToken = response.data['access_token']; //新的accessToken

refreshToken = response.data['refresh_token'];//新的refreshToken

DataUtil.saveRefreshToken(refreshToken); //保存新的refreshToken

} on DioError catch (e) {

if (e.response == null) {

} else {

eventBus.fire(new LoginEvent("Login"));//refreshToken过期,eventBus弹出登录页面

}

}

return accessToken;

}

4.token失效时,异步获取accessToken

onError(DioError error) async {

if (error.response != null && error.response.statusCode == 401) { 401代表token过期

Dio dio = DioUtil().dio;//获取Dio单例

dio.lock();

String accessToken = await getToken(); //异步获取新的accessToken

DataUtil.saveAccessToken(accessToken); //保存新的accessToken

dio.unlock();

}

super.onError(error);

}

5.重新发起一个请求获取数据

//重新发起一个请求获取数据

var request = error.response.request;

try {

var response = await dio.request(request.path,

data: request.data,

queryParameters: request.queryParameters,

cancelToken: request.cancelToken,

options: request,

onReceiveProgress: request.onReceiveProgress);

return response;

} on DioError catch (e) {

return e;

}

6.Dio拦截器的完整代码

class TokenInterceptor extends Interceptor {

@override

onError(DioError error) async {

if (error.response != null && error.response.statusCode == 401) { //401代表token过期

Dio dio = DioUtil().dio;//获取Dio单例

dio.lock();

String accessToken = await getToken(); //异步获取新的accessToken

DataUtil.saveAccessToken(accessToken); //保存新的accessToken

dio.unlock();

//重新发起一个请求获取数据

var request = error.response.request;

try {

var response = await dio.request(request.path,

data: request.data,

queryParameters: request.queryParameters,

cancelToken: request.cancelToken,

options: request,

onReceiveProgress: request.onReceiveProgress);

return response;

} on DioError catch (e) {

return e;

}

}

super.onError(error);

}

Future getToken() async {

String accessToken = DataUtil.getAccessToken; //获取当前的accessToken

String refreshToken = DataUtil.getRefreshToken; //获取当前的refreshToken

Dio dio =DioUtil.getInstance().tokenDio; 创建新Dio实例

dio.options.headers['x-access-token'] = accessToken;//设置当前的accessToken

try {

String url = url; //refreshToken url

var response = await dio.get(url,options: options); //请求refreshToken刷新的接口

accessToken = response.data['access_token']; //新的accessToken

refreshToken = response.data['refresh_token'];//新的refreshToken

DataUtil.saveRefreshToken(refreshToken); //保存新的refreshToken

} on DioError catch (e) {

if (e.response == null) {

} else {

eventBus.fire(new LoginEvent("Login"));//refreshToken过期,eventBus弹出登录页面

}

}

return accessToken;

}

}

7.添加自定义的token拦截器

/*

*Dio网络请求的工具类

*/

class DioUtil {

Dio dio;

Dio tokenDio = new Dio();

static DioUtil _instance;

static DioUtil getInstance() {

if (_instance == null) {

_instance = DioUtil();

}

return _instance;

}

//get方法

Future get(url, {data, options, cancelToken}) async {

String accessToken = DataUtil.getAccessToken; //获取当前的accessToken

String refreshToken = DataUtil.getRefreshToken; //获取当前的refreshToken

options = BaseOptions(

connectTimeout: 15000,

headers: {},

);

dio = new Dio(options);

//添加自定义的token拦截器

dio.interceptors.add(new TokenInterceptor());

Response response;

try {

response = await dio.get(url, cancelToken: cancelToken);

} on DioError catch (e) {

print(e.response.data);

}

return response;

}

}

8.EventBus发送登录失效事件,弹出登录页面

EventBus eventBus = new EventBus();

//自定义登录的eventBus类

class LoginEvent {

String text;

LoginEvent(this.text);

}

//在登录的页面接受eventBus事件

class LoginPageState extends State {

....

@override

void initState() {

super.initState();

eventBus.on().listen((LoginEvent data) {

//TO DO SOMETHING

});

}

}

9.总结

在Flutter项目中自定义一个自动刷新并重发请求的Dio拦截器,经过不断调试,最终实现了功能。如果有什么疑问的话,欢迎留言联系我哦!

dio拦截器 flutter_Flutter开发 Dio拦截器实现token验证过期的功能相关推荐

  1. dio拦截器 flutter_Flutter 中 Dio 拦截器

    有时我们不需要复杂的应用程序,只需要显示一个数据列表的简单功能,我们可以通过一个简单的方法来实现: Future fetchItems() { return Dio().("https:// ...

  2. dio拦截器 flutter_在Dio中使用拦截器使Flutter刷新令牌

    我正在尝试在Dio中使用Interceptor和Dio,我必须处理令牌过期.以下是我的代码 Future getApiClient() async { token = await storage.re ...

  3. Spring Boot(5) web开发(3)拦截器、文件上传、异常处理

    Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...

  4. WebServices中使用cxf开发日志拦截器以及自定义拦截器

    首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截 ...

  5. MyBatis拦截器原理探究MyBatis拦截器原理探究

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis拦截 ...

  6. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  7. 拦截器---SpringMVC(权限拦截)

    拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. **过滤器与拦截器的区别: ...

  8. token拦截器android_vue.js添加拦截器,实现token认证(使用axios)

    什么是token? token是一个用户自定义的任意字符串,目前开发中,token都是在服务端生成并且token的值会保存到服务器后台.只有服务器和客户端知道这个字符串,于是,这个token就成了两者 ...

  9. MyBatis拦截器原理探究MyBatis拦截器原理探究 1

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis拦截 ...

最新文章

  1. 堆叠式传感器架构带来先进的视觉功能
  2. Flex警告:framework.swc”具有默认样式并且在 library-path 中,表...
  3. OpenGL顶点阵列对象
  4. Dajngo-Xadmin 修改菜单摆放排序
  5. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案
  6. @程序员,全面进入万物互联时代必不可缺的 12 大开发平台
  7. matlab 神经网络工具箱的实用
  8. 华为交换机做qos案例_华为交换机 01-08 QoS
  9. Web端网页QQ临时会话在线咨询
  10. 【IDEA 教程系列第 27 篇】idea 显示最近编辑的文件列表
  11. Jenkins构建从github上克隆时,报Host key verification failed.
  12. 乐视手机恢复出厂设置后卡账户登录页面,刷入miui系统后妥妥的开发手机
  13. 配置DeepStreaks环境
  14. SEO图片代码优化技巧汇总
  15. 可怕,GPT-3论坛跟帖灌水一周无人发现!专挑热搜,秒秒钟长文
  16. 用水泥混凝土摊铺机进行作业时该做到的日常养护工作
  17. jdbc shadring 扩容_shadring-jdbc解决查询数据库分库分表的问题
  18. 全国翻译专业资格(水平) 考试
  19. 2021年登高架设考试题及登高架设考试内容
  20. 2022软考高项十大管理知识领域论文骨架

热门文章

  1. Python challenge 全部题解
  2. Mobx和Mobx-react:集中式状态管理
  3. 偶然获得京东内推,四面之后成功拿下offer
  4. shell脚本 简介 及 第一个脚本程序
  5. ibm x系列服务器操作手册,IBM_X系列服务器操作手册v1.0.doc
  6. 30岁的程序员你不懂
  7. Kepware连接研华 ADAM-4050模块总结
  8. 逆势获融资背后,神州租车示范不确定性应对策略
  9. 任志强,商人不能总伤人
  10. 计算机术语cpu是,计算机术语CPU.doc