【发布时间】:2009-10-12 08:51:45
【问题描述】:
我经常需要从 servlet/restlet 或其他任何东西动态生成内容,并且不知道提前的长度。如果客户端是浏览器,进度条不能正常工作,因为我没有设置Content-Length头。有没有办法设置估计的内容长度,所以进度条“或多或少”工作?
【问题讨论】:
标签: java http servlets http-headers
我经常需要从 servlet/restlet 或其他任何东西动态生成内容,并且不知道提前的长度。如果客户端是浏览器,进度条不能正常工作,因为我没有设置Content-Length头。有没有办法设置估计的内容长度,所以进度条“或多或少”工作?
【问题讨论】:
标签: java http servlets http-headers
不,Content-Length value must be the exact content length:
当在允许消息正文的消息中给出 Content-Length 时,其字段值必须与消息正文中的八位字节数完全匹配。 HTTP/1.1 用户代理必须在收到和检测到无效长度时通知用户。
因此,您不能只发送估计的 Content-Length 值来获取进度条。
【讨论】:
虽然我不建议这样做,但您可以将 content-length 设置为内容的估计值,您将获得一个进度条。只要您可以保证您的估计等于或大于实际内容,这通常会起作用。如果您的实际内容大于估计值,则内容将被截断为指定的内容长度。
我在 Firefox、IE 和 Chrome 中对此进行了测试,没有问题。 HTTP 规范规定,如果指定的长度与实际长度不匹配,用户代理必须通知用户,但我在我测试过的任何浏览器中都没有观察到这种行为。
我将其作为一种选择进行了调查,但由于超出规范范围可能会出现不可预见的冲突而放弃了它。
【讨论】:
不清楚你在问什么。您始终可以自己设置 Content-Length 标头,但它实际上需要与您发送的数据量相匹配。在您对长度一无所知的情况下,处理动态数据的标准方法是缓冲输出,找到实际长度,设置标题,然后转储输出。没有真正回答你似乎在问什么,但我认为你问的是不可能的。
【讨论】:
这样做的唯一方法 (as decribed in an RFC) 是不设置 Content-Length 标头,即。响应标头不包含 Content-Length 行。在这种情况下,浏览器不知道正文有多长,因此服务器“告诉”浏览器所有正文已由closing the connection 发送。
我不确定在这种情况下 Java 容器是否会自动关闭连接,或者您是否可以通过某种过滤器自行关闭。
回答你的问题:我认为不可能给浏览器一个估计。
【讨论】:
如果您事先不知道内容的长度,您可以使用“chunked” content encoding(根据 HTTP 版本 1.1)。不过,这并不能解决您的进度条问题——除非您知道要发送多少内容,否则无法让它发挥作用。
【讨论】: