#http-headers #tomcat6 #chunked-encoding
#http-заголовки #tomcat6 #фрагментированное кодирование
Вопрос:
У меня есть веб-приложение, работающее на сервере Tomcat 6.0.29 и JDK 1.6.
Когда я отправляю ответ клиенту, Tomcat отправляет
Transfer-Encoding: chunked
в заголовках, когда размер ответа > 8 КБ. Для ответов размером менее 8 КБ он отправляет
Content-Length :
Я понимаю, что фрагментированное кодирование является предпочтительным способом обработки массовых ответов, однако наши клиенты не хотят изменять свой код (поскольку он распределен по всем серверам).
Как я могу отключить фрагментированное кодирование в Tomcat?
Я мог бы отключить HTTP / 1.1 в Tomcat и включить HTTP / 1.0 (не уверен, как я могу это сделать)
Я попробовал следующее, но безуспешно:
-
В теге Connector в
server.xml
я устанавливаюbufferSize =" 65536"
Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" bufferSize="65536" socketBuffer="65536" redirectPort="8443" /amp;>
-
Использование NIOConnector в server.xml со следующей конфигурацией:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" socket.directBuffer="false" socket.rxBufSize="25188" socket.txBufSize="43800" socket.appReadBufSize="32768" socket.appWriteBufSize="32768" socket.bufferPool="500" socket.bufferPoolSize="100000000" socket.processorCache="500" socket.keyCache="500" socket.eventCache="500" socket.tcpNoDelay="false" socket.soKeepAlive="true" socket.soTimeout="5000" redirectPort="8443" />
Ответ №1:
Единственный способ, которым я мог бы заставить это работать, — это установить размер буфера в ответе.
response.setBufferSize()
задает Content-Length
заголовок размера ответа. Как только размер ответа превысит размер буфера, он вернется к Transfer-Encoding: Chunked
. Размер буфера должен быть установлен на соответствующее значение. Установка более высокого значения приведет к буферизации всего ответа в памяти перед его сбросом. Таким образом, значение должно быть установлено в оптимистичный размер.
Немногие из моих клиентов зависят от Content-Length
заголовка ответа. Я должен установить это для обратной совместимости. По умолчанию размер буфера Tomcat установлен равным 8 КБ (я думаю, что для Weblogic / Websphere это 32 КБ байт).
Ответ №2:
Насколько я знаю, чтобы отключить фрагментированный вывод в Tomcat, вы должны указать заголовок content length в вашем сервлете.
Комментарии:
1. Я не хочу программно устанавливать заголовок Content-Length. Я ожидал, что либо «bufferSize», либо «socketBuffer» сотворят волшебство. Ни один из них не работает.
2. Я совершенно уверен, что это единственный способ заставить его работать с tomcat.
Ответ №3:
Добавление заголовка [Connection: close] к ответу не позволяет Tomcat добавлять заголовок [Transfer-Encoding: chunked].