public class AuthInterceptor implements Interceptor {
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
String token = PreferencesWrapperImpl.SINGLETON.getStringForKey(Constants.PreferenceKey.AUTH_TOKEN_KEY, null);
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED && response.message().equals("Unauthorized")) {
synchronized (this) {
if (response.code() == 401) {
String currentToken = PreferencesWrapperImpl.SINGLETON.getStringForKey(Constants.PreferenceKey.AUTH_TOKEN_KEY, null);
if (currentToken != null && currentToken.equals(token)){
BaseResponse<RefreshTokenResponse> refreshTokenResponse = new RefreshTokenApi().call().blockingGet();
String newToken = refreshTokenResponse.getResponse().header("Authorization");
saveToken(newToken);
}
request.newBuilder().addHeader("Authorization", PreferencesWrapperImpl.SINGLETON.getStringForKey(Constants.PreferenceKey.AUTH_TOKEN_KEY, "")).build();
return chain.proceed(request);
}
}
}
return response;
}
private synchronized void saveToken(String newToken) {
PreferencesWrapperImpl.SINGLETON.saveToken(newToken);
}
}
我正在尝试通过拦截请求来刷新令牌,并检查我是否收到401错误代码,并且请求令牌仍等于当前令牌,这意味着令牌自请求调用以来未得到刷新,因此我正在调用refreshtoken api和更新请求令牌
但是问题是未实现refreshtoken api后的代码,我在日志记录中得到了
D/OkHttp: --> POST http://dev.ogram.ae//api/sp/auth/refresh http/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
x-lang-code: en-us
x-user-type: 1
accept: application/json
D / OkHttp:-> END POST(0字节的正文)
如您所见,post返回了0字节的主体,并且我在这里使用RxJava函数blockingGet来确保我将等到请求成功后再在sharedprefrence中更新令牌并在继续之前更改请求标头
我还使用.commit而不是在preferenceWrapperImp中应用,以确保保存令牌将阻止ui并在令牌被保存之前不会实现更改请求标头
我不知道我应该怎么用错,而不是阻塞Get,还要阻塞UI直到请求调用完成
这种方法甚至可以实施吗?或者还有另一种方法可以实现