国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌苏市| 吴忠市| 嘉祥县| 巴楚县| 沾益县| 共和县| 油尖旺区| 延津县| 鄄城县| 浦县| 竹溪县| 鄂温| 自贡市| 青州市| 米林县| 澎湖县| 精河县| 景谷| 太原市| 平泉县| 淄博市| 永安市| 五大连池市| 洪泽县| 昌平区| 平舆县| 塔河县| 佛坪县| 巴楚县| 措美县| 扶余县| 兴山县| 青神县| 通榆县| 福鼎市| 鞍山市| 伊宁市| 杭锦后旗| 象山县| 普宁市| 莎车县|