Android使用拦截器刷新令牌

问题描述

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)