我有一个由Java Servlet支持的Web服务。该服务由较旧版本的Flash使用。我们通过一些痛苦发现,在这个版本的Flash中,URLLoader
不适用于分块响应。从未从服务器收到任何分块响应。
我使用Glassfish来托管Servlet。我知道如何禁用整个服务器的分块,但这似乎是一个坏主意(是吗?)。
是否有标准方法可以禁用每个请求的分块?我试着调用ServletResponse.setBufferSize(SOME_LARGE_VALUE)
,但令人惊讶的是这并没有影响服务器使用分块的决定。
答案 0 :(得分:2)
来自HttpServlet#doGet()
的{{3}}:
...
尽可能设置
Content-Length
标头(使用ServletResponse.setContentLength(int)
方法),以允许servlet容器使用持久连接将其响应返回给客户端,从而提高性能。如果整个响应适合响应缓冲区,则会自动设置内容长度。使用HTTP 1.1分块编码(这意味着响应具有
Transfer-Encoding
标头)时,请勿设置Content-Length
标头。...
因此,如果您事先设置了响应内容长度,那么它将不会以分块编码方式发送。
response.setContentLength(contentLength);
// ...
更新:您还需要确保<jsp:include>
或RequestDispatcher#include()
不再调用servlet。另请参阅javadoc:
...
ServletResponse
对象的路径元素和参数与调用者保持不变。包含的servlet无法更改响应状态代码或设置标头;任何改变的尝试都会被忽略。...