我必须与需要访问令牌的外部服务集成,以便与每个请求一起发送。访问令牌的到期时间很短(只有几个小时)。我决定以乐观的方式使用访问令牌。我将使用当前令牌调用外部服务。我获得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()吗?我没有找到任何被禁止的信息,但另一方面我还没有看到这样的代码。
答案 0 :(得分:4)
我们做的完全一样 - 并且遇到了问题。您在那里的这段代码将泄漏连接,因为原始响应被忽略而未正确关闭。我目前的解决方案是明确关闭它,然后执行第二次执行。似乎到目前为止工作,但我想它需要更多的评估。