2

我有一个由 Java Servlet 支持的 Web 服务。该服务由旧版本的 Flash 使用。我们痛苦地发现,在这个版本的 Flash 中,URLLoader无法处理分块响应。永远不会从服务器收到任何分块响应。

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

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

4

1 回答 1

2

来自的javadocHttpServlet#doGet()

...

在可能的情况下,设置Content-Length标头(使用ServletResponse.setContentLength(int)方法),以允许 servlet 容器使用持久连接将其响应返回给客户端,从而提高性能。如果整个响应都适合响应缓冲区,则会自动设置内容长度。

当使用 HTTP 1.1 分块编码时(这意味着响应有一个Transfer-Encoding标头),不要设置Content-Length标头。

...

因此,如果您事先设置响应内容长度,则不会以分块编码发送。

response.setContentLength(contentLength);
// ...

更新:您还需要确保 servlet 没有被<jsp:include>or调用RequestDispatcher#include()。另请参阅它的 javadoc

...

ServletResponse对象的路径元素和参数与调用者的保持不变。包含的 servlet 不能更改响应状态码或设置标头;任何进行更改的尝试都会被忽略。

...

于 2011-09-29T02:01:02.680 回答