getResponse标头内容长度返回null

时间:2011-09-15 07:42:30

标签: javascript ajax servlets

有一个发送请求的ajax js函数&得到回应,它经常成功,但当我使用firbug检查时,我闻到了一些混乱的东西。请看一下。
请求成功时 ajaxRequest.getResponseHeader('content-Length'); returns null 但实际上content-length是数字。以下是firbug控制台输出

HeadersResponseXML

Server  Apache-Coyote/1.1
Content-Type    text/xml
Transfer-Encoding   chunked
Date    Thu, 15 Sep 2011 07:23:36 GMT

请求失败时: 它返回0(零),这是正确的。
    Headers
Server Apache-Coyote/1.1
Content-Length 0
Date Thu, 15 Sep 2011 07:23:53 GMT

我没有在成功原因中看到响应标头中的任何内容长度?请比较成功&失败firebug控制台输出。我怎样才能获得实际的内容长度。

5 个答案:

答案 0 :(得分:2)

阅读doGet()的{​​{1}}(或doPost())方法的the javadoc

  

...

     

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

     

使用HTTP 1.1分块编码(这意味着响应具有ServletResponse.setContentLength(int)标头)时,请勿设置Transfer-Encoding标头。

     

...

换句话说,如果你没有在servlet中设置内容长度你自己并且响应体大于默认响应缓冲区大小(通常为2KB,可在服务器设置中配置),那么servlet将使用分块编码发送它(从技术上讲,如果在能够设置内容长度之前必须在内存中缓冲大量响应,则可以防止内存问题。)

如果由于某种原因确实需要响应头中的内容长度,那么在编写之前需要自己缓冲整个响应体。 E.g。

Content-Length

你只需要记住,只要反应体非常大,这就可能成为潜在的记忆力。

答案 1 :(得分:1)

如果标题中未包含内容长度,则无法获取内容(不读取整个响应)。

内容长度标题是可选的。您可以发送一个流作为响应,其中预先知道长度。

答案 2 :(得分:0)

我假设这是一个HTTP / 1.1请求。您可以按照HTTP 1.1规范的规则获取实际的内容长度。如果指定了分块编码,请遵循分块编码规则。如果有Content-Length标头,则会告诉您内容长度。否则,当连接断开时(和一侧或另一侧必须包含“连接:关闭”标题),内容结束。

如果你真的有一个“Content-length:0”标题,那么就没有内容了。

答案 3 :(得分:0)

请阅读http://en.wikipedia.org/wiki/Chunked_transfer_encoding的第一段。使用分块传输编码时,您看不到内容长度。如果你更喜欢Content-Length标题,那么你需要弄清楚如何不使用chunked Transfer Encoding,我怀疑这是一个Apache Coyote问题。

阅读http://tomcat.apache.org/tomcat-4.1-doc/config/coyote.html,看起来你需要弄清楚如何让你的AJAX请求成为HTTP / 1.0。

无论如何你还需要什么?你能不能只使用responseText.length?

答案 4 :(得分:0)

在您的回复标题中:

Transfer-Encoding:   chunked

这是为什么在回复中找不到Content-Length标头的答案。