Retrofit 通过刷新头部Token解决token过期
需求分析:
使用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过期相关推荐
- token 过期刷新令牌_Passport 验证 Token 方法和持续刷新过期时间问题
项目介绍 最近在做一个后台项目,目标是登录后无操作30分钟后自动过期,一直操作的情况下,过期时间一直刷新(目前不考虑每次操作修改对数据库的压力) token有效期检测 操作后自动刷新过期时间 管理员手 ...
- php token过期刷新处理,Laravel Passport token过期后判断refresh_token是否过期
需求:前后端分离状态下,登录失效(token过期)后,前端需要知道下一步是跳转到登录页面还是使用refresh_token刷新token. 这就需要后端根据是否可以刷新token(refresh_to ...
- SpringBoot + SpringSecurity + Mybatis-Plus + JWT + Redis 实现分布式系统认证和授权(刷新Token和Token黑名单)
1. 前提 本文在基于SpringBoot整合SpringSecurity实现JWT的前提中添加刷新Token以及添加Token黑名单.在浏览之前,请查看博客: SpringBoot + Sp ...
- 获取token和token的过期时间后不断刷新过期时间的处理方式
需求:把从第三方接口获取到的token的过期时间保存,下一次在过期时间前触发刷新token. 第一种: package com.transferdata.demo;import com.sun.jmx ...
- SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题
SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 参考文章: (1)SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 (2)https://www. ...
- token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...
- eslint 验证vue文件 报错 unexpected token =解决方法
eslint 验证vue文件 报错 unexpected token =解决方法 参考文章: (1)eslint 验证vue文件 报错 unexpected token =解决方法 (2)https: ...
- 美团token解决思路
美团官网美食区token: _token=eJxVjs1ygjAURt8lWxhJUBJ0h4U2UBVBxEqnC4gIlAERiD90+u5NZ+yidzLzfTn3LO4XaO0DmCEIpxD ...
- python token过期_Python token及token验证
注意仅可以在Python3中使用 token及token验证 涉及模块hmac与base64 hmac模块 简介 HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息 ...
最新文章
- 电气毕业什么都不会怎么办?电气专业毕业的都去干什么了?
- QMainWindow多线程demo
- 004-安装CentOS7后需要的操作
- java bmp rgb数组_将RGB数据写入BMP位图文件
- 一图感受各种机器学习算法
- 解决ufw下pptp客户端连接问题
- 备份mysql_mysql备份及pymysql
- Linux之Keepalived实现服务器集群高可用
- week5 0.1 安装materializecss
- 运用js解决java selenium元素定位问题
- ART模式下dex2oat出错导致系统无法正常启动
- mongodb4.0事务特性(解读)
- 武汉理工大学计算机转专业名单,武汉理工大学转专业的限制
- python图像处理(三)波形叠加模拟
- 手机微信和QQ接收到的文件路径
- 计算机添加启动程序,电脑的开机启动项怎么设置?
- 关于lib文件夹和报java.lang.NoClassDefFoundError解决办法
- 优秀的人都在读的10本好书!
- 都说学3D建模赚钱,到底学了能做什么?
- Linux 0.00简单多任务内核boot.s超详注释
热门文章
- 【JZOJ4117】lhxsb(三角函数+凸壳+CDQ分治)
- ARGOX CP-2140 如何把PPLB改为PPLA
- requests_模拟搜狗翻译
- python输出文件目录和文件名_Python获取文件所在目录和文件名的方法
- 一场疫情,全民变厨子、医生变战士、教师变主播、只有孩子们,依然是神兽!...
- CentOS7.6 安装配置Amber18/AmberTools18(GPU加速版)
- High performance server architecture(高性能服务器架构)
- BeanFacotry 和ApplicationContext联系和区别
- Hibernate一对多/多对一关系映射详解及相应的增删查改操作
- Shogun网站上的关于主流机器学习工具包的比较