双token刷新并把未请求成功的接口进行保存并重新请求

本文介绍了如何在前端应用中处理接口调用中token过期的问题,通过检测并保存过期请求,在token刷新成功后重新发起这些请求,确保用户体验连续性,避免在游戏等关键场景下强制跳转到登录页。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在接口调用中token都是有过期时间的,如果token过期,后端的接口是调用不成功的,如果没有和后端的交互,那么这个项目也就不能称之为项目了。如果在token过期的时候强制用户跳转到登录页面,这在app里面是不合理的,假设一下比如我正在激烈的团战,突然给我跳转到登录页面告诉我登录过期了,让我重新登录???这就很奇怪好吧。

目录

1.初始化数据

2.检测过期请求保存到数组

3.重新调用保存的过期接口

4.完成代码


1.初始化数据

初始化数组,并声明将过期接口保存在数组中的函数

let subSequest = [];//用来存储过期接口

// 把过期请求添加在数组中
function addRequest(request) {
	console.log('把过期请求添加在数组中')
	subSequest.push(request)
}

2.检测过期请求保存到数组

使用响应拦截器,检测toekn是否过期,如果过期把过期请求保存在数组中。

//初始化实例
const http = axios.create({
	// // #ifdef H5
	// baseURL: useUser.baseUrl,
	// // #endif
	// // #ifndef H5

	// // #endif
	baseURL: 'http://114.55.135.211:8887/
好的,以下是一个可能的代码实现,供您参考: 首先,我们需要定义一个TokenInterceptor拦截器类,用于在每次请求接口时检查Token是否过期: ```java public class TokenInterceptor implements Interceptor { private static final String TOKEN_KEY = "token"; private static final String AUTHORIZATION_HEADER = "Authorization"; private SharedPreferences mSharedPreferences; private ApiService mApiService; public TokenInterceptor(Context context, ApiService apiService) { mSharedPreferences = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE); mApiService = apiService; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String token = mSharedPreferences.getString(TOKEN_KEY, ""); if (!TextUtils.isEmpty(token)) { request = request.newBuilder() .addHeader(AUTHORIZATION_HEADER, "Bearer " + token) .build(); } Response response = chain.proceed(request); if (response.code() == 401) { // Token过期,重新请求Token重试请求 String newToken = getNewToken(); if (!TextUtils.isEmpty(newToken)) { // 更新Token重试请求 mSharedPreferences.edit().putString(TOKEN_KEY, newToken).apply(); Request newRequest = request.newBuilder() .addHeader(AUTHORIZATION_HEADER, "Bearer " + newToken) .build(); response = chain.proceed(newRequest); } } return response; } private String getNewToken() { // 发送获取新Token请求,返回新Token Call<TokenResponse> call = mApiService.refreshToken(); try { Response<TokenResponse> response = call.execute(); if (response.isSuccessful()) { TokenResponse tokenResponse = response.body(); return tokenResponse.getToken(); } } catch (IOException e) { e.printStackTrace(); } return null; } } ``` 然后,在创建Retrofit实例时,添加上述拦截器: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new TokenInterceptor(context, apiService)) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); ``` 其中,apiService是一个定义了刷新Token接口的Retrofit接口。 最后,在请求A接口时,如果遇到Token过期的情况,TokenInterceptor会自动发送请求获取新Token重新发送A接口请求: ```java Call<ResponseA> call = apiService.getAData(); call.enqueue(new Callback<ResponseA>() { @Override public void onResponse(Call<ResponseA> call, Response<ResponseA> response) { if (response.isSuccessful()) { // 请求成功 ResponseA responseA = response.body(); // 处理返回的数据 } else { // 请求失败 // 这里不需要处理401 Unauthorized错误,TokenInterceptor已经处理过了 } } @Override public void onFailure(Call<ResponseA> call, Throwable t) { // 请求失败 } }); ``` 以上就是一个简单的android token过期后刷新重新请求A接口的代码实现,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宝子向前冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值