Android OkHttp实现全局过期token自动刷新示例
作者:fancy_boy_石嘉成 发布时间:2023-01-24 10:31:57
问题
一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。
当请求某个接口的时候,我们会在请求的header中携带token消息,但是发现token失效,接口请求报错,怎么马上刷新token,然后重复请求方才那个接口呢?这个过程应该说对用户来说是无感的。
这个过程用流程图可以这样表示:
自动更新token流程
要实现上述需求的话,大家会如何实现呢?
首先讲一下Token和Cookie吧
- cookie
cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。
- token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
解决方案
通过 * ,获取返回的数据
判断token是否过期
如果token过期则刷新token
使用最新的token,重新请求网络数据
自定义自动刷新token的 *
import android.util.Log;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* 自动刷新token的 *
*
* @author shijiacheng
* @version 1.0
*/
public class TokenInterceptor implements Interceptor {
private static final String TAG = "TokenInterceptor";
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
Log.d(TAG, "response.code=" + response.code());
//根据和服务端的约定判断token过期
if (isTokenExpired(response)) {
Log.d(TAG, "自动刷新Token,然后重新请求数据");
//同步请求方式,获取最新的Token
String newToken = getNewToken();
//使用新的Token,创建新的请求
Request newRequest = chain.request()
.newBuilder()
.header("Authorization", "Basic " + newToken)
.build();
//重新请求
return chain.proceed(newRequest);
}
return response;
}
/**
* 根据Response,判断Token是否失效
*
* @param response
* @return
*/
private boolean isTokenExpired(Response response) {
if (response.code() == 301) {
return true;
}
return false;
}
/**
* 同步请求方式,获取最新的Token
*
* @return
*/
private String getNewToken() throws IOException {
// 通过获取token的接口,同步请求接口
String newToken = "";
return newToken;
}
}
配置下OkHttpUtils
/**
* 初始化OkHttpUtils
*/
public OkHttpUtils(){
/**
* 配置OkHttpClient
*/
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(3000, TimeUnit.SECONDS)
.writeTimeout(3000, TimeUnit.SECONDS)
// .cache(new Cache())
// .addInterceptor(interceptor)//这里可以继续添加多种 *
.addInterceptor(new TokenInterceptor())//添加获取token的 *
.build();
}
来源:https://www.jianshu.com/p/8dd4b0a36a75


猜你喜欢
- 在说ClassCastException之前,先介绍下引用类型转换;引用类型转换分为向上转型和向下转型两种; 向上转型:多态本身是
- 本文实例为大家分享了OpenGL绘制Bezier曲线的具体代码,供大家参考,具体内容如下最近在看Francis S Hill ,Jr 和 S
- 本文实例为大家分享了Android Service实现自动更换手机壁纸的具体代码,供大家参考,具体内容如下先看下效果:使用界面:划重点,使用
- 对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp
- 映射匹配兼容性前面我们已经能从表中查询出数据,并将数据封装到模型类中,这整个过程涉及到一张表和一个模型类:之所以数据能够成功的从表中获取并封
- 上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格
- 目录前言if-thenif-then-elseswitch使用 Stringwhiledo-whileforbreakcontinueret
- 使用Regex类需要引用命名空间:using System.Text.RegularExpressions;一、利用Regex类实现验证示例
- 一、前言本篇文章聚焦在“如何使用FragmentStatePagerAdapter来保存Fragment的数据、在内存中
- 前言:最近涉及到和QQ打交道,定义所有的好友一共只能有300条消息,如果一次性从数据库读取300条或者更多,界面会有细微的卡顿.所以考虑了下
- 前言前一篇文章讲了View的触发反馈机制的原理,对于一个自定义View而言,手势的处理都是重写onTouchEvent函数,或者通过setO
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串Given a string
- 本文实例为大家分享了javaOpenCV-4.0.0 实时人脸识别,供大家参考,具体内容如下package com.xu.opencv;im
- 背景项目中经常会用到消息推送功能,关于推送技术的实现,我们通常会联想到轮询、comet长连接技术,虽然这些技术能够实现,但是需要反复连接,对
- 本文实例为大家分享了RecyclerView实现横向滚动效果的具体代码,供大家参考,具体内容如下布局文件<LinearLayout
- 简介本文介绍InheritableThreadLocal的用法。ThreadLocal可以将数据绑定当前线程,如果希望当前线程的Thread
- Nacos 的部署,我使用的时docker 部署(单机模式 Mysql),官网文档:https://nacos.io/zh-cn/docs/
- 一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:p
- 安装hbase首先下载hbase的最新稳定版本 http://www.apache.org/dyn/closer.cgi/hbas
- 本文是基于PDF文档转PNG图片,然后进行图片拼接,拼接后的图片转为base64字符串,然后拼接html文档写入html文件实现PDF文档转