Android token过期刷新处理的方法示例
作者:时间在走 时间:2023-11-23 14:11:40
token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
第一种方案
通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发。此种方式局限性很大,要求后台设计必须符合规范。在实际项目中不可能完美实现。此种方式不做详解,百度很多。
第二种方案
根据和后端协商好的返回码处理刷新token步骤。代码如下;
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<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();
}
/**
* 根据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;
}
}
}
使用方式
okBuilder.addInterceptor(new TokenInterceptor()); //请求过期更换token
来源:https://www.jianshu.com/p/784b20719fce
标签:Android,token,过期刷新
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java构造器与传值学习总结
2023-03-08 23:18:06
C语言之如何求三次方根
2022-04-30 03:13:52
![](https://img.aspxhome.com/file/2023/2/131942_0s.png)
Android 列表倒计时的实现的示例代码(CountDownTimer)
2021-08-03 09:08:02
![](https://img.aspxhome.com/file/2023/3/138333_0s.gif)
微信小程序 springboot后台如何获取用户的openid
2023-01-13 17:07:42
详解SpringCloud服务认证(JWT)
2023-11-14 11:19:43
![](https://img.aspxhome.com/file/2023/6/70916_0s.png)
java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法
2022-05-22 05:32:00
C#打印日志的方法总结
2022-02-08 22:32:00
![](https://img.aspxhome.com/file/2023/4/96334_0s.jpg)
Android Support Annotations资料整理
2021-09-21 13:39:33
SpringBoot中使用redis做分布式锁的方法
2023-02-17 04:08:52
![](https://img.aspxhome.com/file/2023/3/82363_0s.png)
Java实现字符串转换成可执行代码的方法
2022-06-14 02:30:49
Android中调用另一个Activity并返回结果(选择头像功能为例)
2022-09-08 23:43:10
![](https://img.aspxhome.com/file/2023/0/130310_0s.gif)
Android开发手册Chip监听及ChipGroup监听
2023-03-13 01:16:36
![](https://img.aspxhome.com/file/2023/8/128988_0s.png)
springboot实现公众号接收回复消息和超过5秒被动回复消息
2022-10-16 04:40:48
![](https://img.aspxhome.com/file/2023/4/119194_0s.jpg)
深入浅析Java Object Serialization与 Hadoop 序列化
2023-07-30 17:02:16
Android 实现视频字幕Subtitle和横竖屏切换示例
2023-02-06 07:29:37
![](https://img.aspxhome.com/file/2023/6/104646_0s.jpg)
一文带你搞懂Java中的泛型和通配符
2023-12-10 16:15:07
![](https://img.aspxhome.com/file/2023/3/110613_0s.png)
textView 添加超链接(两种实现方式)
2021-08-12 12:58:27
Android编程之消息机制实例分析
2023-07-28 07:24:38
Netty与NIO超详细讲解
2022-08-16 00:44:37
![](https://img.aspxhome.com/file/2023/2/65362_0s.png)
Java中用内存映射处理大文件的实现代码
2023-11-05 06:16:41