【问题标题】:Refresh a token in OkHttp Interceptor在 OkHttp 拦截器中刷新令牌
【发布时间】:2017-02-25 08:51:42
【问题描述】:

我正在编写一个拦截器,这样当我收到 401 时,我会使用刷新令牌在后台获取新的访问令牌,然后将该令牌添加到请求中。

代码示例:

    @Override
    public Response intercept(final Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);

        if (response.code() != 200) {
            try {
                new TokenRequestTask(tokenRequest, request, OkHttpresponse, chain).execute().get(5000, TimeUnit.MILLISECONDS);
                response = chain.proceed(request);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
        }
        return response;
    }

postExecution 的异步任务中,我通过添加收到的新身份验证令牌来更改请求的标头。但问题是输出不符合预期。该函数正在返回旧响应,因为之后异步任务的结果。理想情况下,它应该等待异步任务结果然后返回但没有发生。 如何做到这一点

【问题讨论】:

    标签: android android-asynctask retrofit2 okhttp


    【解决方案1】:

    我正在另一个线程上为 getRefreshToken 使用 Protocol Buffer 并成功地做到了!这是我的代码:

    public class IgapRetrofitInterceptor implements Interceptor {
    
    private boolean isRefreshing;
    
    private TokenContainer tokenContainer = TokenContainer.getInstance();
    
    @NotNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request request = chain.request();
    
        Request.Builder builder = request.newBuilder();
        builder.header("Authorization", tokenContainer.getToken());
        builder.header("Content-Type", "application/json");
        builder.method(original.method(), original.body());
    
        String token = tokenContainer.getToken();
    
        request = builder.build();
        Response response = chain.proceed(request);
    
        if (response.code() == 401) {
            synchronized (this) {
                Log.e("refreshToken", "Failed " + request.toString() + " with token -> " + tokenContainer.getToken());
    
                String currentToken = tokenContainer.getToken();
    
                if (currentToken != null && currentToken.equals(token)) {
                    try {
                        getRefreshToken(); //aysnc
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                if (tokenContainer.getToken() != null) {
                    builder.header("Authorization", tokenContainer.getToken());
                    request = builder.build();
                    Log.e("refreshToken", "Send " + request.toString() + " again with new token -> " + tokenContainer.getToken());
                    Log.e("refreshToken", "--------------------------------------------------------------------------------");
                    return chain.proceed(request);
                }
            }
        }
    
        Log.i("refreshToken", "req 200 with token -> " + tokenContainer.getToken());
    
        return response;
    }
    
    public synchronized void getRefreshToken() throws InterruptedException {
        if (!isRefreshing) {
    
            isRefreshing = true;
    
            Log.e("refreshToken", "Refreshing token...");
            tokenContainer.getRefreshToken(() -> {
                synchronized (IgapRetrofitInterceptor.this) {
                    isRefreshing = false;
                    Log.e("refreshToken", "Proto response on success and token updated with token -> " + tokenContainer.getToken());
                    IgapRetrofitInterceptor.this.notifyAll();
                }
            });
        }
    
        Log.e("refreshToken", "lock thread -> " + android.os.Process.getThreadPriority(android.os.Process.myTid()) + this.toString());
        this.wait();
        Log.e("refreshToken", "unlock thread -> " + android.os.Process.getThreadPriority(android.os.Process.myTid()) + this.toString());
    
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 2019-07-09
      • 1970-01-01
      • 2018-09-15
      • 2018-09-23
      • 2020-02-10
      • 2019-03-28
      • 2021-05-17
      • 2017-12-31
      相关资源
      最近更新 更多