gpt4 book ai didi

java - Rest 模板隐藏 SSLHandshakeException

转载 作者:行者123 更新时间:2023-12-02 11:02:08 25 4
gpt4 key购买 nike

我有两个代码示例,一个使用 Rest Template 和其他 Apache HttpClient 将 json 发布到我们的内部 https Web 服务。

我们的服务负载均衡器端存在这个已知的 SSL 问题,服务器在握手期间没有响应,因此调用客户端预计会失败。

正如预期的那样,当使用 Apache HttpClient (4.5.5) 但 Rest Template (3.1.2) 客户端处理所有请求时,我们会遇到 sslhandshakeException ,没有错误。请注意,这是 SSL 身份验证的一种方式。

奇怪的是,如果我使用 HttpComponentsClientHttpRequestFactory 将读取超时设置为任何值,我就会开始使用 Rest Template 获得 sslhandshakeexception!

但是,如果我使用 SimpleClientHttpRequestFactory 设置相同的读取超时,那么我不会收到异常。

这令人困惑为什么 Rest Template 默认行为会隐藏 SSL 异常。

请查看下面的代码,如果我遗漏了什么,请告诉我。

    String result = "";
try {
HttpComponentsClientHttpRequestFactory clientRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientRequestFactory.setReadTimeout(10000);
final String uri = "{our https url}";
//Removing clientRequestFactory processes all requests fine
RestTemplate restTemplate = new RestTemplate(clientRequestFactory);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity(input, headers);

ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.POST, entity, String.class);

result = response.getBody().toString();

} catch (Exception e) {
e.printStackTrace();
String message = e.getMessage();
System.out.println("Error: "+message);
}
return result;

最佳答案

查看了一些 Stack Overflow 问答后,看起来 SimpleClientHttpRequestFactory 是 Rest 模板的默认使用,除非显式设置或通过 JDK 设置,否则其读取超时为 0。但默认的读取超时可能会使 Http 连接不稳定且过时。此外,这个工厂不太适合多线程环境。这可以解释为什么 SSL 握手错误(间歇性的)被忽略。

另一方面,线程安全的 HttpComponentsClientHttpRequestFactory “按预期”工作并返回 SSL 握手错误。

(注意:SSL 错误的原因是负载均衡器 SSL 设置的某些问题。)

关于java - Rest 模板隐藏 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51255486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com