Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding

户端(PC浏览器或者手机浏览器)在接受到Tomcat的响应的时候,头信息通常都会带上Content-Length ,一般情况下客户端会在接受完Content-Length长度的数据之后才会开始解析。而在Tomcat上,页面处理过程中会将需要out.print的数据都放在缓存中,然后一次性的返回给客户端。

另外一种情况就是头信息中不存在Content-Length ,取而代之的是Tansfer-Encoding:chunked ,这个头信息的的意思是response的内容会被Tomcat分成一块一块的发送,客户端也就不需要等到内容都传输完毕了才解析其中的内容。因为这个时候被传送的数据长度是无法预计的,所以存在Tansfer-Encoding:chunked的话也没有存在Content-Length 的意义了。

那么问题来了,具体在应用的时候如何控制Tomcat响应的是Content-Length还是Tansfer-Encoding呢?

我们都知道内置对象out,在调用print或者write的时候都会先往内部buffer里头写数据,而不是直接输出到客户端。Response Header 的 Content-Length 其实就是计算了buffer的数据长度。那他什么时候输出到客户端呢?有几种情况:

1. out的属性autoFlush为true,那么当buffer(默认大小是8 * 1024)的数据满了,Tomcat会自动向客户端flush一次数据,之后buffer就被重置了。必然Content-Length就拿不到了。所以这个时候Repsonse Header就成了Tansfer-Encoding:chunked。

2. out的属性autoFlush为false,如果数据超出了buffer的容量,这个时候会抛出异常IOException。

3. 如果数据在buffer的容量范围之内,那么Content-Length可以被计算,头信息就会带上Content-Length。

4. 如果手动调用了out.flush(),那么buffer中的数据立即会被输出到客户端,这个时候响应数据其实还未传输完毕,所以这种传输也可以看做分块传输了。Repsonse Header自然是Tansfer-Encoding:chunked。

转载: http://blog.csdn.net/shootyou/archive/2011/01/13/6135669.aspx

从以上几种情况可以看出,一旦调用了out.flush,buffer就被重置了,Content-Length就无法计算了,Repsonse Header必然是Tansfer-Encoding:chunked。

时间: 2024-10-10 14:20:44

Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding的相关文章

wget/curl查看请求响应头信息

wget / curl 是两个比较方便的测试http功能的命令行工具,大多数情况下,测试http功能主要是查看请求响应 头信息 ,而给这两个工具加上适当的命令行参数即可轻易做到,其实查man手册就能找到对应的参数选项,不过这里仍然mark一下. wget --debug Turn on debug output, meaning various information important to the developers of Wget if it does not work properly

http响应头信息

HTTP 响应头信息 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息. 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST等). Content-Encoding 文档的编码(Encode)方法.只有在解码之后才可以得到Content-Type头指定的内容类型.利用gzip压缩文档能够显著地减少HTML文档的下载时间.Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netsca

HTTP 响应头信息

HTTP 响应头信息 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息.

AFNetworking 2.0获取响应头信息

转载请注明出处:http://blog.csdn.net/dengbin9009/article/details/43304813 前文有提到在初始化的时候可以设置Http的头信息,这没有任何问题,但是在笔者使用过程中,时常是要获取Http返回的一些头信息,在初次用AFNetworking2.0新特性NSURLSessionDataTask的时候,为了获取返回的头信息,搞了两个晚上,先是度娘,谷歌,StackOverflow,然后各种那个群找人,嘴壶问同事找大神,最后都说没有用过.就在想要放弃,

curl/wget 测试http请求的响应头信息

1. wget –debug wget可以使用debug信息来查看信息头,如下: [[email protected] ~]# wget --debug http://192.168.112.129/index.html DEBUG output created by Wget 1.12 on linux-gnu. --2017-06-01 10:15:12--  http://192.168.112.129/index.html Connecting to 192.168.112.129:80

Zuul网关过滤器中转发头信息不起作用

大家应该都知道在做Zuul网关过滤的时候,如果不在网关过滤时转发头信息,经过网关时头信息就会丢失. 但我用 addZuulRequestHeader转发头信息时,却不起作用,在子服务的controller取不到头信息的内容,代码如下: 1.引入依赖 1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-

在python获取网页的代码中添加头信息模拟浏览器

为什么要添加头部信息,因为有时候有些网页会有反爬虫的设置,导致无法获取正常的网页,在这里,在代码的头部添加一个headers信息,模拟成浏览器去访问网页. 没有添加头部信息的代码 import urllib2 url = "http://blog.51cto.com/lsfandlinux/2046467" file = urllib2.urlopen(url) html = file.read() print html 接下来添加头部信息,首先在浏览器打开百度一下,然后检查网页的头部

OpenCV中响应鼠标信息

转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h>#include <highgui.h>#include <stdio.h> void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** argv){     CvCapture *capture; 

Servlet响应头信息

1.输出excel表格 1 package servlet_pack; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet