Android token过期刷新处理的方法示例
token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
第一种方案
通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。
第二种方案
根据和后端协商好的返回码处理刷新token步骤。代码如下;
publicclassTokenInterceptorimplementsInterceptor{
@Override
publicResponseintercept(Chainchain)throwsIOException{
Request.Builderrequest=chain.request().newBuilder();
//添加默认的Token请求头
request.addHeader("Cookie",UserInfo.getInstance().getPhpSessionId());
Responseproceed=chain.proceed(request.build());
okhttp3.MediaTypemediaType=proceed.body().contentType();
//如果token过期再去重新请求token然后设置token的请求头重新发起请求用户无感
Stringcontent=proceed.body().string();
if(isTokenExpired(content)){
StringnewToken=getNewToken();
UserInfo.getInstance().setPhpSessionId(newToken);
//使用新的Token,创建新的请求
RequestnewRequest=chain.request().newBuilder()
.addHeader("Cookie",newToken)
.build();
returnchain.proceed(newRequest);
}
returnproceed.newBuilder()
.body(okhttp3.ResponseBody.create(mediaType,content))
.build();
}
privateStringgetNewToken(){
//通过一个特定的接口获取新的token,此处要用到同步的retrofit请求
IndexServiceservice=IndexService.Builder.getServer();
Call>call=service.getToke(
UserInfo.getInstance().getPhone(),
UserInfo.getInstance().getPwd(),
0);
//要用retrofit的同步方式
BaseObjResultnewToken=null;
try{
newToken=call.execute().body();
}catch(IOExceptione){
e.printStackTrace();
}
returnnewToken.getResult().getPHPSESSID();
}
/**
*根据Response,判断Token是否失效
*
*@return
*/
privatebooleanisTokenExpired(StringresultStr){
RequestCoderequestCode=newGson().fromJson(resultStr,RequestCode.class);
//err==3token过期
if(requestCode.getErr()==3){
LogUtils.e("Token登录过期了");
ToastUtils.showShortSafe("Token登录过期了");
returntrue;
}
returnfalse;
}
classRequestCode{
privateinterr;
privateStringmsg;
publicintgetErr(){
returnerr;
}
publicvoidsetErr(interr){
this.err=err;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
}
}
使用方式
okBuilder.addInterceptor(newTokenInterceptor());//请求过期更换token
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。