Android OkHttp实现全局过期token自动刷新示例

作者:fancy_boy_石嘉成 时间:2023-01-24 10:31:57 

问题

一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。

当请求某个接口的时候,我们会在请求的header中携带token消息,但是发现token失效,接口请求报错,怎么马上刷新token,然后重复请求方才那个接口呢?这个过程应该说对用户来说是无感的。

这个过程用流程图可以这样表示:

Android OkHttp实现全局过期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,避免多次查库。

解决方案

  1. 通过 * ,获取返回的数据

  2. 判断token是否过期

  3. 如果token过期则刷新token

  4. 使用最新的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

标签:OkHttp,token,自动刷新
0
投稿

猜你喜欢

  • Android使用WebView实现文件下载功能

    2022-03-01 09:41:44
  • C#如何使用Task类解决线程的等待问题

    2023-01-04 18:23:22
  • Kotlin超简单实现StepView的方法

    2022-01-21 09:28:27
  • Java实战个人博客系统的实现流程

    2023-04-12 02:32:44
  • java求数组元素重复次数和java字符串比较大小示例

    2023-08-04 22:20:02
  • SpringBoot处理接口幂等性的两种方法详解

    2021-12-23 10:32:32
  • Android实现局部图片滑动指引效果示例

    2022-10-16 03:05:53
  • Android 破解视频App去除广告功能详解及解决办法总结

    2022-07-16 23:28:50
  • 浅谈一下Java中的悲观锁和乐观锁

    2023-08-12 05:54:27
  • Android Xutils3网络请求的封装详解及实例代码

    2021-07-20 20:27:49
  • PowerManagerService之唤醒锁的使用获取创建示例解析

    2021-09-29 06:42:22
  • 深入浅析Spring 的aop实现原理

    2023-01-10 00:00:10
  • 从Python程序中访问Java类的简单示例

    2022-02-19 08:53:13
  • 详解AngularJs与SpringMVC简单结合使用

    2023-10-22 04:19:08
  • java Hibernate多对多映射详解及实例代码

    2023-07-02 07:24:40
  • 【Redis缓存机制】详解Java连接Redis_Jedis_事务

    2023-05-23 19:59:55
  • 深入理解Java注解类型(@Annotation)

    2022-11-14 17:28:42
  • Android下拉刷新官方版

    2021-11-25 06:52:51
  • c# Linq distinct不会调用Equals方法详解

    2021-09-03 09:53:13
  • Java比较两个List的值是否相等的方法

    2022-12-31 15:41:37
  • asp之家 软件编程 m.aspxhome.com