Retrofit+OkHttp中Token刷新流程无响应的问题求助
Retrofit+OkHttp中Token刷新流程无响应的问题求助
我现在在Android项目里用Retrofit和OkHttp实现token刷新机制,但遇到了一个棘手的问题:拦截器能检测到401 Unauthorized响应,也能获取到refresh token,但后续的token刷新请求完全没执行,日志只打到了"Refresh token exists!"就没下文了。
下面是我的TokenInterceptor代码:
class TokenInterceptor(private val context: Context) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val accessToken = PreferenceUtil(context).getAccessToken() Log.d("ApiClient", "Current token: $accessToken") // Add access token to header if it exists val requestWithToken = if (accessToken != null) { originalRequest.newBuilder() .header("Authorization", "Bearer $accessToken") .build() } else { originalRequest } // Send request var originalResponse = chain.proceed(requestWithToken) if (originalResponse.code == 401) { // Refresh token request Log.e("ApiClient", "Token expired error, ${originalResponse.code}") val refreshToken = PreferenceUtil(context).getRefreshToken() Log.d("ApiClient", "Refresh token: $refreshToken") if (refreshToken != null) { Log.d("ApiClient", "Refresh token exists!") // Asynchronous task to request a new access token val newAccessToken = runBlocking { reissueToken(refreshToken) Log.d("ApiClient", "Why is this not working?") } newAccessToken?.let { Log.d("ApiClient", "Replacing with new refresh token!") val newRequest = originalRequest.newBuilder() .header("Authorization", "Bearer $it") .build() originalResponse = chain.proceed(newRequest) } } } return originalResponse } private suspend fun reissueToken(refreshToken: String): String? { return withContext(Dispatchers.IO) { val apiService = ApiClient.getInstance(context).create(LogInService::class.java) val response = apiService.reissueToken(refreshToken) Log.d("ApiClient", "Receiving new response: ${response}") if (response.isSuccessful) { Log.d("ApiClient", "Response successful") response.body()?.let { tokenResponse -> Log.d("ApiClient", "Token successfully renewed") PreferenceUtil(context).setAccessToken(tokenResponse.accessToken) PreferenceUtil(context).setRefreshToken(tokenResponse.refreshToken) return@withContext tokenResponse.accessToken } } else { Log.d("ApiClient", "Response failed...") null } } } }
项目里相关的代码结构:
- ApiClient:负责初始化Retrofit实例,配置OkHttpClient时添加了这个TokenInterceptor
- TokenInterceptor:核心拦截逻辑,先给请求附加access token,收到401响应时尝试调用刷新接口获取新token
目前打印的日志只有这些:
"Current token: $accessToken" "Token expired error, 401" "Refresh token: $refreshToken" "Refresh token exists!"
完全看不到reissueToken方法里的日志,刷新请求根本没触发,有没有大佬能帮我看看问题出在哪?
备注:内容来源于stack exchange,提问作者onyuuu
相关产品推荐
相关产品推荐

