java方法过期作废_java相关:Android token过期刷新处理的方法示例

java相关:Android token过期刷新处理的方法示例

发布于 2020-3-19|

复制链接

摘记: token

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进t ..

tokentoken的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。

第一种方案

通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。第二种方案

根据和后端协商好的返回码处理刷新token步骤。代码如下;

```java

public class TokenInterceptor implements Interceptor {

@Override

public Response intercept(Chain chain) throws IOException {

Request.Builder request = chain.request().newBuilder();

//添加默认的Token请求头

request.addHeader("Cookie", UserInfo.getInstance().getPhpSessionId());

Response proceed = chain.proceed(request.build());

okhttp3.MediaType mediaType = proceed.body().contentType();

//如果token过期 再去重新请求token 然后设置token的请求头 重新发起请求 用户无感

String content = proceed.body().string();

if (isTokenExpired(content)) {

String newToken = getNewToken();

UserInfo.getInstance().setPhpSessionId(newToken);

//使用新的Token,创建新的请求

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() {

// 通过一个特定的接口获取新的token,此处要用到同步的retrofit请求

IndexService service = IndexService.Builder.getServer();

Call> call = service.getToke(

UserInfo.getInstance().getPhone(),

UserInfo.getInstance().getPwd(),

0);

//要用retrofit的同步方式

BaseObjResult newToken = null;

try {

newToken = call.execute().body();

} catch (IOException e) {

e.printStackTrace();

}

return newToken.getResult().getPHPSESSID();

}

/**

* 根据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;

}

}

}

```

使用方式

```java

okBuilder.addInterceptor(new TokenInterceptor()); //请求过期更换token

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值