Java Servlet HttpResponse contentLenght Header

时间:2013-01-17 14:58:09

标签: http java-ee servlets

当我发送包含zip文件的HttpResponse时,如果我没有指定contentLenght标头会发生什么。

我做了一些测试,似乎默认情况下使用正确的文件长度设置标头。 我能确定这种情况总会发生吗?当我能找到一些关于?

的文档时

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

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

达维德

1 个答案:

答案 0 :(得分:2)

如果实际响应内容长度完全适合响应缓冲区(通常为2KB(取决于服务器make / version / config)),则将设置内容长度标头。但是,如果实际响应内容长度大于响应缓冲区,那么它将比响应内容的结束更快地刷新,那么servlet将发送带有chunked encoding的响应并忽略任何设置尝试内容长度标题。

以下引用的HttpServlet#doGet()的javadoc中提到了这一点:

  

...

     

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

     

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

     

...

使用“普通”编码,数据作为一个连续块发送。

actualContent

使用分块编码,数据以块状态发送,如下所示

part1LengthInHexadecimal
actualPart1Content

part2LengthInHexadecimal
actualPart2Content

part3LengthInHexadecimal
actualPart3Content

0

以十六进制表示的部分长度表示客户端下一个数据块的大小(这样它就不会“意外”将下一个块解析为当前块的一部分)。最后,客户将部件粘合在一起。

另请参阅wikipedia中的示例。