gpt4 book ai didi

servlets - 我应该设置 response.setContentLength() header 吗?

转载 作者:可可西里 更新时间:2023-11-01 17:11:03 27 4
gpt4 key购买 nike

如果在发送包含 zip 文件的 HttpServletResponse 时没有指定 Content-Length header 会怎样?

我做了一些测试,似乎标题默认设置为正确的文件长度。我能确定这总是会发生吗?我什么时候可以找到有关的文档?

最佳答案

如果实际响应内容长度完全适合响应缓冲区,通常为 2KB(取决于服务器 make/version/config),则将设置内容长度 header 。然而,如果实际的响应内容长度大于响应缓冲区,那么它会在到达响应内容末尾之前被刷新,然后 servlet 将发送带有 chunked encoding 的响应。并忽略任何设置内容长度 header 的尝试。

这在 HttpServlet#doGet() 的 javadoc 中提到引用如下:

...

Where possible, set the Content-Length header (with the ServletResponse.setContentLength(int) method), to allow the servlet container to use a persistent connection to return its response to the client, improving performance. The content length is automatically set if the entire response fits inside the response buffer.

When using HTTP 1.1 chunked encoding (which means that the response has a Transfer-Encoding header), do not set the Content-Length header.

...

使用“正常”编码,数据作为一个连续的 block 发送。

actualContent

使用分块编码,数据以如下所示的 block 形式发送

part1LengthInHexadecimal
actualPart1Content

part2LengthInHexadecimal
actualPart2Content

part3LengthInHexadecimal
actualPart3Content

0

十六进制的部分长度指示客户端下一个数据 block 有多大(这样它就不会“意外地”将下一个数据 block 解析为当前数据 block 的一部分)。最后,客户将零件粘合在一起。顺便说一下,这也是在响应中使用 Gzip 时的默认行为,原因很明显,最终内容长度事先是未知的。

另请参阅 wikipedia 中的示例.

请注意,在文件下载时省略内容长度时,用户体验将是文件下载进度未知。 IE。最终用户将看不到文件大小和剩余字节/时间的任何指示。如果这种用户体验对您很重要,那么您真的应该事先设置内容长度。您可以通过首先写入内存缓冲区(例如 new ByteArrayOuputStream(bytes))或临时文件(例如 Files#createTempFile())来执行此操作,这样您就可以获得bytes.lengthfile.length() 的内容长度,最后将该临时缓冲区/文件写入响应。

关于servlets - 我应该设置 response.setContentLength() header 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com