javascript - getResponse header 内容长度返回 null

标签 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<br/> Server Apache-Coyote/1.1<br/> Content-Length 0<br/> Date Thu, 15 Sep 2011 07:23:53 GMT

当它成功时,我在响应 header 中没有看到任何内容长度,为什么?请比较成功和失败的 Firebug 控制台输出。我怎样才能获得实际的内容长度。

最佳答案

阅读the javadoc HttpServletdoGet()(或doPost())方法:

...

Where possible, set the Content-Length header (with the ServletResponse.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 the Content-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/

相关文章:

javascript - 为什么我无法处理 $.ajax 返回的 HTTP 状态代码?

javascript - Ajax 成功 : {return false;}

php - 将 JavaScript 确认框的结果分配给 PHP 变量

ajax - 由于 Ajax,Tomcat session 空闲不工作

javascript - 如何在 KnockoutJS 或 JavaScript 中将数字元素格式化为货币

javascript - 根据父宽度定位绝对顶部属性

java - 如何在自定义 servlet 中获取 Liferay session ?

apache - tomcat JndiRealm表单认证如何实现 "remember me"?

JavaScript 正则表达式符号出现

javascript - 展开折叠图标更改 Bootstrap CSS