Java 在RequestConfig和SocketConfig中设置套接字超时对于HTTP和HTTPS的工作方式不同

Java 在RequestConfig和SocketConfig中设置套接字超时对于HTTP和HTTPS的工作方式不同,java,https,apache-httpclient-4.x,Java,Https,Apache Httpclient 4.x,我已在SocketConfig中设置套接字超时,并将SocketConfig设置为连接管理器 connManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(soTimeout).build()) 并通过在RequestConfig中将其设置为 httpRequest.setConfig(RequestConfig.copy(defaultRequestConfig).setSocketTimeout(timeout)

我已在
SocketConfig
中设置套接字超时,并将SocketConfig设置为连接管理器

connManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(soTimeout).build())
并通过在
RequestConfig
中将其设置为

httpRequest.setConfig(RequestConfig.copy(defaultRequestConfig).setSocketTimeout(timeout).build())  
参考资料

对于所有http请求,使用RequestConfig设置的新值将按预期覆盖旧值。 但是对于https请求,它总是考虑在SocketConfig中设置的旧值

我还将httpclient从4.3.1升级到4.3.6,因为我知道这可能是4.3.1参考中的一个问题。 但即使这样也无助于我解决这个问题。

我遗漏了什么吗?你知道我如何解决这个问题吗?

这只是部分正确
RequestConfig
表示请求级别设置,而
SocketConfig
表示连接级别设置。安全连接需要进行SSL/TLS握手并建立安全会话,然后才能用于执行请求。因此,
RequestConfig
设置只有在完全建立HTTPS连接后才能关联。在此之前,仅应用
SocketConfig

听起来像是一个设计缺陷——如果不设置默认套接字配置,客户端可能永远挂起,尽管事实上开发人员已经注意到了这一点,例如延长特定请求的默认超时时间。IMHO请求配置(如果至少来自客户端上下文)应适用于SLL握手!)Upvote用于从HTTP层拆分SSL。@Antoniossss:确实如此。在SSL握手时,如果连接超时是有限的,而套接字超时是未定义的(无限),则会应用连接超时