<强>标记强>
标记的意思是“令牌”,是用户身份的验证方式,最简单的令牌组成:uid(用户唯一的身份标识)、时间(当前时间的时间戳),签字(签名,由令牌的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接令牌请求服务器)。还可以把不变的参数也放进牌,避免多次查库。
<强>第一种方案强>
通过okhttp提供的身份接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。
<强>第二种方案强>
根据和后端协商好的返回码处理刷新令牌步骤。代码如下;
公共类TokenInterceptor实现拦截器{ @Override 公开回应拦截(链链)抛出IOException { 请求。.newBuilder Builder请求=chain.request () ();//添加默认的令牌请求头 请求。.getPhpSessionId addHeader(“饼干”,UserInfo.getInstance () ()); 反应进行=chain.proceed (request.build ()); okhttp3。MediaType MediaType=proceed.body () .contentType ();//如果牌过期再去重新请求令牌然后设置标记的请求头重新发起请求用户无感 .string字符串内容=proceed.body () (); 如果(isTokenExpired(内容)){ 字符串newToken=getNewToken (); UserInfo.getInstance () .setPhpSessionId (newToken);//使用新的令牌,创建新的请求 .newBuilder请求newRequest=chain.request () () .addHeader(“饼干”,newToken) .build (); 返回chain.proceed newRequest (); } 返回proceed.newBuilder () .body (okhttp3.ResponseBody。创建(mediaType、内容) .build (); } 私人字符串getNewToken () {//通过一个特定的接口获取新的令牌,此处要用到同步的改造请求 IndexService服务=IndexService.Builder.getServer (); Call比;调用=service.getToke ( .getPhone UserInfo.getInstance () (), .getPwd UserInfo.getInstance () (), 0);//要用改造的同步方式 BaseObjResult newToken=零; 尝试{ .body newToken=call.execute () (); }捕捉(IOException e) { e.printStackTrace (); } .getPHPSESSID返回newToken.getResult () (); }/* * *根据反应,判断令牌是否失效 * * @return */私人布尔isTokenExpired(字符串resultStr) { RequestCode RequestCode=new Gson () .fromJson (resultStr RequestCode.class);//呃==3牌过期 如果(requestCode.getErr ()==3) { LogUtils.e(“令牌登录过期了"); ToastUtils.showShortSafe(“令牌登录过期了"); 返回true; } 返回错误; } 类RequestCode { 私人int犯错; 私人字符串味精; 公共int getErr () { 返回错误; } 公共空间setErr (int犯错){ 这一点。呃=犯错; } 公共字符串getMsg () { 返回味精; } 公共空间setMsg(字符串味精){ 这一点。味精=味精; } } } >之前 使用方式
okBuilder。addInterceptor(新TokenInterceptor ());//请求过期更换牌以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Android牌过期刷新处理的方法示例