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

By | 01月13日
Advertisement

欢迎转帖,But请注明出处谢谢: http://blog.csdn.net/shootyou/archive/2011/01/13/6135669.aspx

先说说原理:

客户端(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。

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

另外如果有需要自己编写客户端的,可以参考下:http://hfutxf.javaeye.com/blog/807647 ,里面会说到Tansfer-Encoding:chunked的时候的一种需要考虑的情况,本人没有验证过。

Similar Posts:

  • 学习脚步----Tomcat 中响应头信息(Http Response Header) Content-Length 等(转载)

    转自:http://blog.csdn.net/shootyou/archive/2011/01/13/6135669.aspx 先说说原理: 客户端(PC浏览器或者手机浏览器)在接受到Tomcat的响应的时候,头信息通常都会带上Content-Length , 一般情况下客户端会在接受完Content-Length长度的数据之后才会开始解析.而在Tomcat上,页面处理过程中会将需要out.print的数据都放在缓存中,然后一次性的返回给客户端. 另外一种情况就是头信息中不存在Content-

  • Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之15.Servlet响应头信息

    –HTTP响应的格式 –设置响应报头 –常见MIME类型 –常见HTTP 1.1响应报头 –构建Excel电子表格 –动态生成JPEG图像 –定时刷新页面 ###################Michael分割线####################### • HTTP响应的格式 • 设置响应报头 – 设置任意响应头 • public void setHeader(String headerName, String headerValue) – 设定任意的报头 • public void s

  • 向xml文件中写入头信息的正确做法

    需要通过代码自动生成xml文件,开始的时候采用XmlDocument.Save()方法,但是这样做,无法把头信息,也就是下面这些内容写进去: <?xml version="1.0" encoding="utf-8"?> 找了一下,大家都建议使用XmlTextWriter.WriteProcessingInstruction()方法,基本上就像下面这种: XmlTextWriter writer = new XmlTextWriter("test

  • 在tomcat中配置gzip的方法

    在tomcat中配置gzip的方法是在conf/server.xml文件中把以前的配置修改成 Java代码   <Connector              port="8080"       maxHttpHeaderSize="8192"              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"        

  • Tomcat中的Connector配置

    JBoss使用Tomcat作为Web容器,因此在JBoss中对于Web容器的配置也类似于在Tomcat中的配置,主要就是对于 server.xml文件的编辑,在JBoss 5.x中,这个文件位于${JBOSS.HOME}\server\${confifure}\deploy\jbossweb.sar下,其中 configure的值可以是all, default,web,standard, minimal等.下面的代码展示了一个JBoss default配置下的server.xml,由于篇幅原因,

  • curl获得头信息

    curl中获取头信息: curl -D $filename -D参数 会将返回的header信息存放到filename文件中.可以通过文本匹配获得response code信息.

  • Tomcat中的Connector配备

    Tomcat中的Connector配置 JBoss使用Tomcat作为Web容器,因此在JBoss中对于Web容器的配置也类似于在Tomcat中的配置,主要就是对于server.xml文件的编辑,在JBoss 5.x中,这个文件位于${JBOSS.HOME}\server\${confifure}\deploy\jbossweb.sar下,其中configure的值可以是all, default,web,standard, minimal等.下面的代码展示了一个JBoss default配置下的

  • 如何查看网页的response header信息并利用其提升性能?

    查看网页的header是优化web应用的关键一环,从header中,可以检查到非常多的信息:网页在squid中的缓存时间(age).客户端缓存时间(expires).是否有最后修改时间(last-modified).是否在squid中命中(x-cache).服务器版本.服务器时间(Date).gzip压缩情况(Content-Encoding)等等.以上说的这些都是比较基本的信息,本文最后介绍一个利用header来分析客户端请求走向的问题. 先介绍几种查看header的办法: 1.httpwat

  • HTTP header 响应头详解

    有四种头标: 1.通用头标 既可用于请求有可用于响应,并且是作为一个整体而不是特定资源与事务相关联. 2.请求头标 允许客户端传递关于自身信息和希望的响应形式. 3.响应头标 服务器用于传递自身信息和响应. 4.实体头标 定义被传送资源的信息.既可用于请求,也可用于响应 头标以如下的单行形式发送. <name>:<value><crlf> 其中 name是头标名,大小写敏感 value是头标值: crlf是回车换行符 JSP页面可以使用request.getHeader

  • 黑马程序员--HTTP请求中的常用请求字段和HTTP的响应状态码及响应头

    ---------------------- android培训.java培训.期待与您交流! ---------------------- 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类型 Accept-Charset:用于告诉服务器,客户机采用的编码格式 Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式 Accept-Language:客户机的语言环境 Host:客户机通过这个头高速服务器,想访问的主机名 If-Modified-

Tags: