您好,登錄后才能下訂單哦!
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。