Android token过期刷新处理的方法示例

 更新时间:2018年10月23日 11:26:06   作者:时间在走  
这篇文章主要介绍了Android token过期刷新处理的方法示例,本文详细的介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

token

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

第一种方案

通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。

第二种方案

根据和后端协商好的返回码处理刷新token步骤。代码如下;

public class TokenInterceptor implements Interceptor {

  @Override
  public Response intercept(Chain chain) throws IOException {

    Request.Builder request = chain.request().newBuilder();
    //添加默认的Token请求头
    request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId());

    Response proceed = chain.proceed(request.build());
    okhttp3.MediaType mediaType = proceed.body().contentType();

    //如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感
    String content = proceed.body().string();
    if (isTokenExpired(content)) {

      String newToken = getNewToken();

      UserInfo.getInstance().setPhpSessionId(newToken);
      //使用新的Token,创建新的请求
      Request newRequest = chain.request().newBuilder()
          .addHeader("Cookie", newToken)
          .build();
      return chain.proceed(newRequest);
    }
    return proceed.newBuilder()
        .body(okhttp3.ResponseBody.create(mediaType, content))
        .build();

  }

  private String getNewToken() {
    // 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求
    IndexService service = IndexService.Builder.getServer();
    Call<BaseObjResult<UserBean>> call = service.getToke(
        UserInfo.getInstance().getPhone(),
        UserInfo.getInstance().getPwd(),
        0);

    //要用retrofit的同步方式
    BaseObjResult<UserBean> newToken = null;
    try {
      newToken = call.execute().body();
    } catch (IOException e) {
      e.printStackTrace();
    }

    return newToken.getResult().getPHPSESSID();
  }

  /**
   * 根据Response,判断Token是否失效
   *
   * @return
   */
  private boolean isTokenExpired(String resultStr) {
    RequestCode requestCode = new Gson().fromJson(resultStr, RequestCode.class);
    //err==3 token过期
    if (requestCode.getErr() == 3) {
      LogUtils.e("Token登录过期了");
      ToastUtils.showShortSafe("Token登录过期了");
      return true;
    }

    return false;
  }

  class RequestCode {
    private int err;
    private String msg;

    public int getErr() {
      return err;
    }

    public void setErr(int err) {
      this.err = err;
    }

    public String getMsg() {
      return msg;
    }

    public void setMsg(String msg) {
      this.msg = msg;
    }
  }

}

使用方式

okBuilder.addInterceptor(new TokenInterceptor()); //请求过期更换token

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

相关文章

  • Spring MVC 拦截器实现登录

    Spring MVC 拦截器实现登录

    这篇文章主要介绍了Spring MVC 拦截器实现登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • RabbitMQ的消息确认机制的详细总结

    RabbitMQ的消息确认机制的详细总结

    RabbitMQ消息确认机制指的是在消息传递过程中,发送方发送消息后,接收方需要对消息进行确认,以确保消息被正确地接收和处理,本文就讲给大家详解介绍RabbitMQ的几种消息确认机制,需要的朋友可以参考下
    2023-07-07
  • java 键盘输入一个数,输出数组中指定元素的示例

    java 键盘输入一个数,输出数组中指定元素的示例

    今天小编就为大家分享一篇java 键盘输入一个数,输出数组中指定元素的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 使用Spring Framework 时常犯的十大错误(小结)

    使用Spring Framework 时常犯的十大错误(小结)

    这篇文章主要介绍了使用Spring Framework 时常犯的十大错误(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Jaxb2实现JavaBean与xml互转的方法详解

    Jaxb2实现JavaBean与xml互转的方法详解

    这篇文章主要介绍了Jaxb2实现JavaBean与xml互转的方法,简单介绍了JAXB的概念、功能及实现JavaBean与xml互转的具体操作技巧,需要的朋友可以参考下
    2017-04-04
  • java8 stream多字段排序的实现

    java8 stream多字段排序的实现

    这篇文章主要介绍了java8 stream多字段排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • maven项目引用外部jar包的方法

    maven项目引用外部jar包的方法

    本篇文章主要介绍了maven项目引用外部jar的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java中JS引擎实现的一句话木马

    Java中JS引擎实现的一句话木马

    这篇文章主要为大家介绍了如何利用Java中JS引擎实现的一句话木马,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-02-02
  • SpringBoot实现IP地址解析的示例代码

    SpringBoot实现IP地址解析的示例代码

    本篇带大家实践在springboot项目中获取请求的ip与详细地址,我们的很多网站app中都已经新增了ip地址显示,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 如何将Spring Session存储到Redis中实现持久化

    如何将Spring Session存储到Redis中实现持久化

    这篇文章主要介绍了如何将Spring Session存储到Redis中实现持久化,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论