根据请求禁用分块

时间:2011-09-29 00:18:57

标签: flash web-services servlets glassfish chunked-encoding

我有一个由Java Servlet支持的Web服务。该服务由较旧版本的Flash使用。我们通过一些痛苦发现,在这个版本的Flash中,URLLoader不适用于分块响应。从未从服务器收到任何分块响应。

我使用Glassfish来托管Servlet。我知道如何禁用整个服务器的分块,但这似乎是一个坏主意(是吗?)。

是否有标准方法可以禁用每个请求的分块?我试着调用ServletResponse.setBufferSize(SOME_LARGE_VALUE),但令人惊讶的是这并没有影响服务器使用分块的决定。

1 个答案:

答案 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无法更改响应状态代码或设置标头;任何改变的尝试都会被忽略。

     

...