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

  

<强>问题

  

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

  

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

  

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

  

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

  

自动更新令牌流程
  

  

要实现上述需求的话,大家会如何实现呢?

  

<强>首先讲一下牌和饼干吧

  

<强>——饼干

  

饼干是保存在本地终端的数据.cookie由服务器生成,发送给浏览器,浏览器把饼干以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于饼干是存在客户端上的,所以浏览器加入了一些限制确保饼干不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的饼干数量是有限的。

  

饼干的组成有:名称(关键),值(值),有效域(域),路径(域的路径,一般设置为全局:" "),失效时间,安全标志(指定后,饼干只有在使用SSL连接时才发送到服务器(https)。

  

<强>——令牌/强>

  

标记的意思是“令牌”,是用户身份的验证方式,最简单的令牌组成:uid(用户唯一的身份标识)、时间(当前时间的时间戳),签字(签名,由令牌的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接令牌请求服务器)。还可以把不变的参数也放进牌,避免多次查库。

  

解决方案

  
      <李>通过拦截器,获取返回的数据李   <李>判断令牌是否过期   <李>如果牌过期则刷新令牌李   <李>使用最新的令牌,重新请求网络数据李   
  

自定义自动刷新令牌的拦截器
  

        进口android.util.Log;   进口java.io.IOException;   进口okhttp3.Interceptor;   进口okhttp3.Request;   进口okhttp3.Response;/* *   *自动刷新令牌的拦截器   *   * @author shijiacheng   * @version 1.0   */公共类TokenInterceptor实现拦截器{      私有静态最终字符串标签=癟okenInterceptor”;      @Override   公开回应拦截(链链)抛出IOException {   请求请求=chain.request ();   响应响应=chain.proceed(请求);   日志。d(标签,”反应。代码=" + response.code ());//根据和服务端的约定判断标记过期   如果(isTokenExpired(响应)){   日志。d(标签,“自动刷新令牌,然后重新请求数据”);//同步请求方式,获取最新的令牌   字符串newToken=getNewToken ();//使用新的令牌,创建新的请求   请求newRequest=chain.request ()   .newBuilder ()   .header(“授权”、“基本”+ newToken)   .build ();//重新请求   返回chain.proceed newRequest ();   }   返回响应;   }/* *   *根据反应,判断令牌是否失效   *   * @param响应   * @return   */私人布尔isTokenExpired(响应响应){   如果(response.code ()==301) {   返回true;   }   返回错误;   }/* *   *同步请求方式,获取最新的令牌   *   * @return   */私人字符串getNewToken()抛出IOException {//通过获取令牌的接口,同步请求接口   字符串newToken=" ";   返回newToken;   }   }      之前      

配置下OkHttpUtils
  

     /* *   *初始化OkHttpUtils   */公共OkHttpUtils () {/* *   *配置OkHttpClient   */OkHttpClient客户=new OkHttpClient.Builder ()   TimeUnit.SECONDS .connectTimeout(15日)   TimeUnit.SECONDS .readTimeout (3000)   TimeUnit.SECONDS .writeTimeout (3000)//.cache(新缓存())//.addInterceptor(拦截器)//这里可以继续添加多种拦截器   .addInterceptor(新TokenInterceptor())//添加获取令牌的拦截器   .build ();      }   之前      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

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