9

我必须与需要随每个请求一起发送访问令牌的外部服务集成。访问令牌的过期时间很短(只有几个小时)。我决定以乐观的方式使用访问令牌。我将使用当前令牌调用外部服务。如果遇到 401,我将刷新令牌并再次调用外部 API。

我决定使用 ClientHttpRequestInterceptor 来实现描述的重试机制。

public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
   ClientHttpResponse response = execution.execute(request, body);
   if(response.getStatusCode() == UNAUTHORIZED) {
       refreshToken();
       updateToken(request);
       response = execution.execute(request, body);
   }
   return response;
}

我已经对其进行了测试并且可以正常工作,但是是否允许调用 execution.execute() 两次?我没有找到任何禁止它的信息,但另一方面我也没有看到这样的代码。

4

1 回答 1

5

我们正在做同样的事情 - 并且遇到了问题。您拥有的这段代码将泄漏连接,因为原始响应被忽略并且未正确关闭。我目前的解决方案是显式关闭它,然后执行第二次。到目前为止似乎有效,但我想它需要更多的评估。

于 2017-08-30T11:46:47.943 回答