Android token過(guò)期刷新處理的方法示例
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,避免多次查庫(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)求 用戶無(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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
elasticsearch集群cluster主要功能詳細(xì)分析
這篇文章主要為大家介紹了elasticsearch集群cluster主要功能詳細(xì)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
java如何確定一個(gè)鏈表有環(huán)及入口節(jié)點(diǎn)
這篇文章主要介紹了java如何確定一個(gè)鏈表有環(huán)及入口節(jié)點(diǎn),想了解數(shù)據(jù)結(jié)構(gòu)的同學(xué)可以參考下2021-04-04
Java多線程wait()和notify()方法詳細(xì)圖解
wait()和notify()是直接隸屬于Object類,也就是說(shuō)所有對(duì)象都擁有這一對(duì)方法,下面這篇文章主要給大家介紹了關(guān)于Java多線程wait()和notify()方法詳細(xì)圖解的相關(guān)資料,需要的朋友可以參考下2022-10-10
java 二維數(shù)組矩陣乘法的實(shí)現(xiàn)方法
java 二維數(shù)組矩陣乘法的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-03-03
基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)
下面小編就為大家?guī)?lái)一篇基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
Fluent Mybatis零xml配置實(shí)現(xiàn)復(fù)雜嵌套查詢
本文主要介紹了Fluent Mybatis零xml配置實(shí)現(xiàn)復(fù)雜嵌套查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

