溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Android token過(guò)期刷新處理的方法示例

發(fā)布時(shí)間:2020-10-15 01:52:50 來(lái)源:腳本之家 閱讀:267 作者:時(shí)間在走 欄目:編程語(yǔ)言

token

token的意思是“令牌”,是用戶(hù)身份的驗(yàn)證方式,最簡(jiǎn)單的token組成:uid(用戶(hù)唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長(zhǎng)的十六進(jìn)制字符串,可以防止惡意第三方拼接token請(qǐng)求服務(wù)器)。還可以把不變的參數(shù)也放進(jìn)token,避免多次查庫(kù)。

第一種方案

通過(guò)okhttp提供的Authenticator接口,但是只有HTTP返回碼為401時(shí)才會(huì)觸發(fā)。此種方式局限性很大,要求后臺(tái)設(shè)計(jì)必須符合規(guī)范。在實(shí)際項(xiàng)目中不可能完美實(shí)現(xiàn)。此種方式不做詳解,百度很多。

第二種方案

根據(jù)和后端協(xié)商好的返回碼處理刷新token步驟。代碼如下;

public class TokenInterceptor implements Interceptor {

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

    Request.Builder request = chain.request().newBuilder();
    //添加默認(rèn)的Token請(qǐng)求頭
    request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId());

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

    //如果token過(guò)期 再去重新請(qǐng)求token 然后設(shè)置token的請(qǐng)求頭 重新發(fā)起請(qǐng)求 用戶(hù)無(wú)感
    String content = proceed.body().string();
    if (isTokenExpired(content)) {

      String newToken = getNewToken();

      UserInfo.getInstance().setPhpSessionId(newToken);
      //使用新的Token,創(chuàng)建新的請(qǐng)求
      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() {
    // 通過(guò)一個(gè)特定的接口獲取新的token,此處要用到同步的retrofit請(qǐng)求
    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();
  }

  /**
   * 根據(jù)Response,判斷Token是否失效
   *
   * @return
   */
  private boolean isTokenExpired(String resultStr) {
    RequestCode requestCode = new Gson().fromJson(resultStr, RequestCode.class);
    //err==3 token過(guò)期
    if (requestCode.getErr() == 3) {
      LogUtils.e("Token登錄過(guò)期了");
      ToastUtils.showShortSafe("Token登錄過(guò)期了");
      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()); //請(qǐng)求過(guò)期更換token

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI