【问题标题】:Sending estimate HTTP Content-Length from Servlet etc从 Servlet 等发送估计的 HTTP 内容长度
【发布时间】:2009-10-12 08:51:45
【问题描述】:

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

【问题讨论】:

    标签: java http servlets http-headers


    【解决方案1】:

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

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

    因此,您不能只发送估计的 Content-Length 值来获取进度条。

    【讨论】:

      【解决方案2】:

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

      我在 Firefox、IE 和 Chrome 中对此进行了测试,没有问题。 HTTP 规范规定,如果指定的长度与实际长度不匹配,用户代理必须通知用户,但我在我测试过的任何浏览器中都没有观察到这种行为。

      我将其作为一种选择进行了调查,但由于超出规范范围可能会出现不可预见的冲突而放弃了它。

      【讨论】:

        【解决方案3】:

        不清楚你在问什么。您始终可以自己设置 Content-Length 标头,但它实际上需要与您发送的数据量相匹配。在您对长度一无所知的情况下,处理动态数据的标准方法是缓冲输出,找到实际长度,设置标题,然后转储输出。没有真正回答你似乎在问什么,但我认为你问的是不可能的。

        【讨论】:

        • 我也怀疑这可能是不可能的,但我希望只是我的 HTTP-fu 不符合它!
        【解决方案4】:

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

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

        回答你的问题:我认为不可能给浏览器一个估计。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-07
            • 2012-03-01
            • 2010-10-17
            • 2012-01-17
            • 2017-10-12
            • 2013-03-08
            相关资源
            最近更新 更多