的Java Servlet的HttpResponse contentLenght头(Java Ser

2019-10-17 14:58发布

如果我不指定contentLenght头,当我发送包含一个zip文件中的HttpResponse发生什么事。

我做了一些测试,它似乎是头默认情况下使用正确的文件lenght设置。 我可以肯定,这总是会发生的。 当我发现可以对一些文件?

这是代码的最重要的部分:

    response.setContentType("application/zip");
            response.addHeader("Content-disposition", "attachment; filename=" + zipFileName);
        zos.close();
        out.close();
        response.flushBuffer(); 

达维德

Answer 1:

如果实际响应内容长度在响应缓冲区,它通常是2KB完全装配(这取决于服务器化妆/版本/配置),则内容长度报头将被设置。 然而,如果实际的响应内容长度比响应缓冲大,因此,它会被冲洗比的响应内容的端越早到达,则servlet将发送与响应分块编码 ,并忽略任何尝试设置内容长度头。

这是除其他提到的的Javadoc HttpServlet#doGet()将在下文中引用:

...

如果可能,设置Content-Length头(与ServletResponse.setContentLength(int)法),以允许servlet容器使用的持久连接到它的响应返回给客户端,从而提高性能。 如果整个响应响应缓冲区内适合的内容长度被自动设置。

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

...

与“正常”编码时,数据被发送作为一个连续的块。

actualContent

随着分块编码,数据以块看起来像这样发

part1LengthInHexadecimal
actualPart1Content

part2LengthInHexadecimal
actualPart2Content

part3LengthInHexadecimal
actualPart3Content

0

以十六进制的部分长度指示客户端数据的下一个块有多大(以便它不会“意外”解析下一个块作为当前组块的一部分)。 最后,客户端胶合部分组合在一起。

另见例如维基百科 。



文章来源: Java Servlet HttpResponse contentLenght Header