Android token過期刷新處理的方法示例
token
token的意思是“令牌”,是用戶身份的驗(yàn)證方式,最簡(jiǎn)單的token組成:uid(用戶唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長(zhǎng)的十六進(jìn)制字符串,可以防止惡意第三方拼接token請(qǐng)求服務(wù)器)。還可以把不變的參數(shù)也放進(jìn)token,避免多次查庫。
第一種方案
通過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過期 再去重新請(qǐng)求token 然后設(shè)置token的請(qǐng)求頭 重新發(fā)起請(qǐng)求 用戶無感 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() { // 通過一個(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過期 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()); //請(qǐng)求過期更換token
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
RabbitMQ的消息確認(rèn)機(jī)制的詳細(xì)總結(jié)
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對(duì)消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文就講給大家詳解介紹RabbitMQ的幾種消息確認(rèn)機(jī)制,需要的朋友可以參考下2023-07-07java 鍵盤輸入一個(gè)數(shù),輸出數(shù)組中指定元素的示例
今天小編就為大家分享一篇java 鍵盤輸入一個(gè)數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié))
這篇文章主要介紹了使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Jaxb2實(shí)現(xiàn)JavaBean與xml互轉(zhuǎn)的方法詳解
這篇文章主要介紹了Jaxb2實(shí)現(xiàn)JavaBean與xml互轉(zhuǎn)的方法,簡(jiǎn)單介紹了JAXB的概念、功能及實(shí)現(xiàn)JavaBean與xml互轉(zhuǎn)的具體操作技巧,需要的朋友可以參考下2017-04-04java8 stream多字段排序的實(shí)現(xiàn)
這篇文章主要介紹了java8 stream多字段排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03SpringBoot實(shí)現(xiàn)IP地址解析的示例代碼
本篇帶大家實(shí)踐在springboot項(xiàng)目中獲取請(qǐng)求的ip與詳細(xì)地址,我們的很多網(wǎng)站app中都已經(jīng)新增了ip地址顯示,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01如何將Spring Session存儲(chǔ)到Redis中實(shí)現(xiàn)持久化
這篇文章主要介紹了如何將Spring Session存儲(chǔ)到Redis中實(shí)現(xiàn)持久化,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07