我在Tomcat 7.0.75上部署了一个Spring Boot Web应用程序,我们最近使用https进行了保护,具有以下server.xml:
<Connector port="8443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="50"
server="web"
allowTrace="false"
keystoreFile="/app/certs/keystore.jks"
keystorePass="wouldntYouLikeToKnow"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
sslEnabledProtocols="TLSv1.1,TLSv1.2"
ciphers="TLS_...SHA"
maxSwallowSize="-1"
connectionTimeout="20000"
maxKeepAliveRequests="100"
socket.soKeepAlive="true"/>`
当我们转到https时,在报告200 OK响应代码后,具有大(多个MB)json响应主体的请求开始在Chrome中产生奇怪的警告消息。 IE也无法完全下载响应。
它只是永远显示警告,永远不会完成下载。小要求工作正常。从客户端的角度来看,请求尚未完成,因为https调用的成功函数和错误函数都不会执行。如图所示,到第一个字节的时间(TTFB)相对较快,但是在下载期间花费了大量时间并且它永远不会离开该阶段。 Tomcat显然保持http连接打开,客户端仍然期待数据,因为当我关闭浏览器时,Tomcat会报告套接字关闭错误。有没有人知道发生了什么以及为什么大型响应下载永远不会通过https完成,但在http上工作正常?
修改1 这是从Linux调用的curl命令和响应。
curl -X GET https://host.com/context -H 'accept: application/json,
text/plain, */*' -H 'cache-control: no-cache' -H 'token: 12acdee7-ef76-
4147-98d2-d90e4414d4e6' -H 'user-name: vn62253' -H 'user-security-id: 1'
-k -I
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, PUT, GET, HEAD, OPTIONS, DELETE
Access-Control-Expose-Headers: Content-disposition, Content-Type
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-
Type, Access-Control-Request-Method, Access-Control-Request-Headers, User-
Security-Id, Token, User-Name, Client-TZ-Offset
X-Application-Context: Compliance_WS:8765
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Vary: Accept-Encoding
Date: Tue, 29 Aug 2017 14:33:47 GMT
Server: web
答案 0 :(得分:0)
您可以增加tomcat的默认超时时间。如果您可以使用像ngnix这样的负载均衡器,则可能会遇到此问题,因为它的默认超时间隔为1分钟。