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

作者:时间在走 时间:2023-11-23 14:11:40 

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

来源:https://www.jianshu.com/p/784b20719fce

标签:Android,token,过期刷新
0
投稿

猜你喜欢

  • Java构造器与传值学习总结

    2023-03-08 23:18:06
  • C语言之如何求三次方根

    2022-04-30 03:13:52
  • Android 列表倒计时的实现的示例代码(CountDownTimer)

    2021-08-03 09:08:02
  • 微信小程序 springboot后台如何获取用户的openid

    2023-01-13 17:07:42
  • 详解SpringCloud服务认证(JWT)

    2023-11-14 11:19:43
  • java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    2022-05-22 05:32:00
  • C#打印日志的方法总结

    2022-02-08 22:32:00
  • Android Support Annotations资料整理

    2021-09-21 13:39:33
  • SpringBoot中使用redis做分布式锁的方法

    2023-02-17 04:08:52
  • Java实现字符串转换成可执行代码的方法

    2022-06-14 02:30:49
  • Android中调用另一个Activity并返回结果(选择头像功能为例)

    2022-09-08 23:43:10
  • Android开发手册Chip监听及ChipGroup监听

    2023-03-13 01:16:36
  • springboot实现公众号接收回复消息和超过5秒被动回复消息

    2022-10-16 04:40:48
  • 深入浅析Java Object Serialization与 Hadoop 序列化

    2023-07-30 17:02:16
  • Android 实现视频字幕Subtitle和横竖屏切换示例

    2023-02-06 07:29:37
  • 一文带你搞懂Java中的泛型和通配符

    2023-12-10 16:15:07
  • textView 添加超链接(两种实现方式)

    2021-08-12 12:58:27
  • Android编程之消息机制实例分析

    2023-07-28 07:24:38
  • Netty与NIO超详细讲解

    2022-08-16 00:44:37
  • Java中用内存映射处理大文件的实现代码

    2023-11-05 06:16:41
  • asp之家 软件编程 m.aspxhome.com