需求分析:

使用token来维持用户登陆状态是很常见的,但应当明确后台设置的token也都是有一定期限的,假如说是7天,那么我们的用户信息的获取必然是和token相绑定的,所以不可避免的我们的Android应用会存在token过期的问题,以下将一个开发案例来记录下如何自动刷新token的问题。

运行结果:

运行流程是获取相应的信息,首先是验证了token是否有效[包括一开始token不存在的情况去获取],发现是过期的或者无效的,紧接着去调用相应的api去获取登陆的token,之后再进行存储,然后请求成功。

核心代码,也都有注释。这里说明一点,获取token一定得是同步请求,异步会造成在返回对应的token之前已经进行了请求。

public class MyBaseApiRetrofit {private final OkHttpClient mClient;// 这里的token是从数据库中获得的-------------private String token = "Bearer default";public OkHttpClient getClient() {return mClient;}public MyBaseApiRetrofit(){//OkHttpClientOkHttpClient.Builder builder = new OkHttpClient.Builder();// -------- 在这里获得 token,通过数据库缓存 ********-----------if (BuildConfig.DEBUG) {// Log信息拦截器HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//设置 Debug Log 模式builder.addInterceptor(loggingInterceptor);}// 添加头部拦截器 并设定验证刷新 *******builder.addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request.Builder request = chain.request().newBuilder();//添加Token请求头 这里的token应当是从本地数据库中读取的 **********request.addHeader("Authorization", token);Response proceed = chain.proceed(request.build());//如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感if (isTokenExpired(proceed)){String newHeaderToken = getNewToken();//使用新的Token,创建新的请求Request newRequest = chain.request().newBuilder().addHeader("Authorization", newHeaderToken).build();return chain.proceed(newRequest);}return proceed;}});mClient = builder.build();}/*** 根据Response,判断Token是否失效* 401表示token过期* @param response* @return*/private boolean isTokenExpired(Response response) {Log.e("状态码",response.code()+"---------------------");if (response.code() == 401) {return true;}return false;}/*** 这里可以考虑让后台提供一个接口,通过用户名直接返回一个token-----------------* @return* @throws IOException*/@SuppressLint("CheckResult")private String getNewToken() throws IOException {LoginRequest loginRequest = new LoginRequest();loginRequest.setUsername("apple2");loginRequest.setPassword("123abc");OkHttpClient okHttpClient = new OkHttpClient();Gson gson = new Gson();String json = gson.toJson(loginRequest);RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json);Request request = new Request.Builder().url(MyApi.BASE_URL+"auth").post(requestBody).build();Call call = okHttpClient.newCall(request);String string = Objects.requireNonNull(call.execute().body()).string();MyLoginResponse loginResponse = JsonUtils.jsonToBean(string, MyLoginResponse.class);token = "Bearer "+loginResponse.getData().getToken();Log.e("token刷新结果",token);return token;}
}

总结

好了,一个解决token过期的小例子就是这样了,也是希望在点滴的工作与学习中取得长足的进步。

Retrofit 通过刷新头部Token解决token过期相关推荐

  1. token 过期刷新令牌_Passport 验证 Token 方法和持续刷新过期时间问题

    项目介绍 最近在做一个后台项目,目标是登录后无操作30分钟后自动过期,一直操作的情况下,过期时间一直刷新(目前不考虑每次操作修改对数据库的压力) token有效期检测 操作后自动刷新过期时间 管理员手 ...

  2. php token过期刷新处理,Laravel Passport token过期后判断refresh_token是否过期

    需求:前后端分离状态下,登录失效(token过期)后,前端需要知道下一步是跳转到登录页面还是使用refresh_token刷新token. 这就需要后端根据是否可以刷新token(refresh_to ...

  3. SpringBoot + SpringSecurity + Mybatis-Plus + JWT + Redis 实现分布式系统认证和授权(刷新Token和Token黑名单)

    1. 前提   本文在基于SpringBoot整合SpringSecurity实现JWT的前提中添加刷新Token以及添加Token黑名单.在浏览之前,请查看博客:   SpringBoot + Sp ...

  4. 获取token和token的过期时间后不断刷新过期时间的处理方式

    需求:把从第三方接口获取到的token的过期时间保存,下一次在过期时间前触发刷新token. 第一种: package com.transferdata.demo;import com.sun.jmx ...

  5. SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题

    SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 参考文章: (1)SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 (2)https://www. ...

  6. token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...

    来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...

  7. eslint 验证vue文件 报错 unexpected token =解决方法

    eslint 验证vue文件 报错 unexpected token =解决方法 参考文章: (1)eslint 验证vue文件 报错 unexpected token =解决方法 (2)https: ...

  8. 美团token解决思路

    美团官网美食区token: _token=eJxVjs1ygjAURt8lWxhJUBJ0h4U2UBVBxEqnC4gIlAERiD90+u5NZ+yidzLzfTn3LO4XaO0DmCEIpxD ...

  9. python token过期_Python token及token验证

    注意仅可以在Python3中使用 token及token验证 涉及模块hmac与base64 hmac模块 简介 HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息 ...

最新文章

  1. 电气毕业什么都不会怎么办?电气专业毕业的都去干什么了?
  2. QMainWindow多线程demo
  3. 004-安装CentOS7后需要的操作
  4. java bmp rgb数组_将RGB数据写入BMP位图文件
  5. 一图感受各种机器学习算法
  6. 解决ufw下pptp客户端连接问题
  7. 备份mysql_mysql备份及pymysql
  8. Linux之Keepalived实现服务器集群高可用
  9. week5 0.1 安装materializecss
  10. 运用js解决java selenium元素定位问题
  11. ART模式下dex2oat出错导致系统无法正常启动
  12. mongodb4.0事务特性(解读)
  13. 武汉理工大学计算机转专业名单,武汉理工大学转专业的限制
  14. python图像处理(三)波形叠加模拟
  15. 手机微信和QQ接收到的文件路径
  16. 计算机添加启动程序,电脑的开机启动项怎么设置?
  17. 关于lib文件夹和报java.lang.NoClassDefFoundError解决办法
  18. 优秀的人都在读的10本好书!
  19. 都说学3D建模赚钱,到底学了能做什么?
  20. Linux 0.00简单多任务内核boot.s超详注释

热门文章

  1. 【JZOJ4117】lhxsb(三角函数+凸壳+CDQ分治)
  2. ARGOX CP-2140 如何把PPLB改为PPLA
  3. requests_模拟搜狗翻译
  4. python输出文件目录和文件名_Python获取文件所在目录和文件名的方法
  5. 一场疫情,全民变厨子、医生变战士、教师变主播、只有孩子们,依然是神兽!...
  6. CentOS7.6 安装配置Amber18/AmberTools18(GPU加速版)
  7. High performance server architecture(高性能服务器架构)
  8. BeanFacotry 和ApplicationContext联系和区别
  9. Hibernate一对多/多对一关系映射详解及相应的增删查改操作
  10. Shogun网站上的关于主流机器学习工具包的比较