有一个发送请求和获取响应的 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<br/>
Server Apache-Coyote/1.1<br/>
Content-Length 0<br/>
Date Thu, 15 Sep 2011 07:23:53 GMT
当它成功时,我在响应 header 中没有看到任何内容长度,为什么?请比较成功和失败的 Firebug 控制台输出。我怎样才能获得实际的内容长度。
最佳答案
阅读the javadoc HttpServlet
的doGet()
(或doPost()
)方法:
...
Where possible, set the
Content-Length
header (with theServletResponse.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 theContent-Length
header....
换句话说,如果您没有在您的 servlet 中设置内容长度您自己,并且响应正文大于默认响应缓冲区大小(通常为 2KB,可在服务器设置中配置),那么servlet 将使用分块编码发送它(从技术上讲,如果它必须在能够设置内容长度之前将大量响应完全缓冲在内存中,以防止内存问题)。
如果出于某种原因你真的需要响应头中的内容长度,那么你需要在写入之前自己缓冲整个响应体。例如
StringBuilder builder = new StringBuilder();
builder.append(someXml);
// ...
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
response.setContentLength(builder.length());
response.getWriter().write(builder.toString());
您只需要记住,当响应主体非常大时,这可能会占用大量内存。
关于javascript - getResponse header 内容长度返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7427407/