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的同步方式 BaseObjResult newToken=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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。