Android使用拦截器刷新令牌

时间:2020-08-26 13:54:44

标签: android interceptor

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直到请求调用完成

这种方法甚至可以实施吗?或者还有另一种方法可以实现

0 个答案:

没有答案