从Servlet等发送估计HTTP Content-Length

时间:2009-10-12 08:51:45

标签: java http servlets http-headers

我经常需要从servlet / restlet或其他任何东西动态生成内容,并且不知道提前的长度。如果客户端是浏览器,则进度条无法正常工作,因为我没有设置Content-Length标头。有没有办法设置估计的内容长度,所以进度条“或多或少”?

5 个答案:

答案 0 :(得分:7)

不,Content-Length value must be the exact content length

  

当在允许消息正文的消息中给出Content-Length时,其字段值必须与消息正文中的OCTET数完全匹配。当收到并检测到无效长度时,HTTP / 1.1用户代理必须通知用户。

因此,您无法仅发送估计的 Content-Length 值来获取进度条。

答案 1 :(得分:3)

虽然我不建议您这样做,但您可以将内容长度设置为内容的估计值,然后您将获得一个进度条。只要您能保证您的估计等于或大于实际内容,这通常会起作用。如果您的实际内容大于估计值,则内容将被截断为指定的内容长度。

我在Firefox,IE和Chrome中测试了这个问题。 HTTP规范声明用户代理必须通知用户指定的长度是否与实际长度不匹配,但我没有在我测试的任何浏览器中观察到此行为。

我将此作为一种选择进行了调查,但由于在规范范围之外进行游戏可能存在无法预料的冲突而放弃了它。

答案 2 :(得分:1)

不清楚你在问什么。您始终可以自己设置Content-Length标头,但它需要实际匹配您要发送的数据量。处理动态数据的标准方法是提前缓慢输出,查找实际长度,设置标题,然后转储输出。不是真的回答你似乎在问什么,但我认为你所要求的是不可能的。

答案 3 :(得分:0)

执行此操作的唯一方法(as decribed in an RFC)不是设置Content-Length标头,即。响应头不包含Content-Length行。在这种情况下,浏览器不知道正文有多长,因此服务器“告诉”浏览器closing the connection发送了所有正文。

我不确定Java容器是否会在这种情况下自动关闭连接,或者你是否可以通过某种过滤器自己关闭。

回答你的问题:我不认为可以给浏览器估算。

答案 4 :(得分:0)

如果事先不知道您的内容的长度,您可以使用“chunked” content encoding(根据HTTP版本1.1)。但这并不能解决你的进度条问题 - 除非你知道要发送多少内容,否则没有办法让它工作。