首页 > 系统 > Android > 正文

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

2019-10-21 21:36:19
字体:
来源:转载
供稿:网友

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

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表