欢迎转帖,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.iteye.com/blog/807647,里面会说到Tansfer-Encoding:chunked的时候的一种需要考虑的情况,本人没有验证过。
分享到:
相关推荐
`Access-Control-Allow-Origin`是CORS机制中的核心响应头之一,它决定了哪个源(Origin)的请求可以被服务器接受。当浏览器检测到该响应头,且其值与请求的源匹配时,才会允许浏览器访问返回的数据。若该头缺失或值...
缺少X-Content-Type-Options Header 未启用Web浏览器XSS保护 等的解决办法 在tomcat下的conf里的web.xml中增加以下过滤器 <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina....
【Tomcat编码问题】在处理中文字符时,Tomcat可能会出现乱码情况,尤其是在输出中文时显示为"???". 这通常与字符编码设置有关。要解决这个问题,我们需要理解Tomcat处理字符编码的过程,并采取相应的配置调整。 ...
负载均衡是网络服务中的关键概念,旨在分散网络流量,提高系统可用性和响应速度。在Tomcat中,可以通过集群配置来实现负载均衡。当多个Tomcat实例协同工作时,可以将请求分发到不同的服务器,避免单一服务器过载。这...
这些配置通常是在`conf`目录下的`tomcat-users.xml`和`web.xml`文件中完成的。 #### 二、用户认证配置 用户认证是Tomcat安全配置的基础,通过设置用户名和密码来验证用户的合法性。配置文件`tomcat-users.xml`位于...
解决tomcat8-maven-plugin-3.0-r1655215.jar阿里云同有的问题。放到路径org\apache\tomcat\maven\tomcat8-maven-plugin\3.0-r1655215\就可以了
3. **客户端请求头信息**:浏览器发送的请求头中包含的字符集信息与服务器端解析时所用的字符集不一致也会导致乱码问题。 4. **数据库连接**:数据库连接时没有指定正确的字符集,也会导致数据读取时出现乱码。 ###...
将“ Content-Security-Policy”或“ Content-Security-Policy-Report-Only”标头添加到响应中。 另请参阅: 通常,您只需要有限的数目,也不需要任何init参数。 如果未定义init参数,则Header将如下所示: ...
《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...
- `apache-tomcat-8.5.97` 文件夹中,包含了以下主要组件: - `bin`:存放用于启动、停止和管理Tomcat的脚本和可执行文件。 - `conf`:包含Tomcat的配置文件,如server.xml、web.xml等。 - `lib`:存放Tomcat...
Maven 使用 tomcat8-maven-plugin 插件 Maven 是一个流行的构建自动化工具,它可以帮助开发者自动完成项目的编译、测试、打包、部署等任务。...在本文中,我们详细介绍了 tomcat8-maven-plugin 插件的使用方法和优点。
【标题】"tomcat-redis-session-manager包集合下载(tomcat8)"涉及的主要知识点是将Redis集成到Tomcat中管理会话(session),以提高Web应用的性能和可扩展性。 【描述】中提到的"所需的tomcat-redis-session-...
在本压缩包"apache-tomcat-6.0.29.zip"中,包含的是Apache Tomcat 6.0.29版本的源码、配置文件、库文件以及相关的文档资料。 Tomcat 6.0.29是Apache Tomcat的一个稳定版本,发布于2010年,支持Java EE 5规范。以下...
标题 "tomcat-redis-session-manager-1.2-tomcat-6&7" 指的是一个用于在Tomcat服务器中集成Redis作为session管理器的组件。这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而...
在解压后的"apache-tomcat-9.0.65"文件夹中,你会看到这个目录,里面可能包含示例应用程序和其他默认配置。 9. **Conf**目录:包含了Tomcat的主要配置文件,如`server.xml`(定义服务器配置)、`web.xml`(定义全局...
用于配置 tomcat-redis-session-manager
这个压缩包"apache-tomcat-9.0.13-windows-x64.zip"是Apache Tomcat 9.0.13版本的64位Windows版安装包。在Windows环境下,这个版本为用户提供了一个稳定且高效的平台来开发和运行基于Java的Web应用程序。 Tomcat的...
"apache-tomcat-8.5.66-windows-x64.zip"是专门为64位Windows系统设计的最新版本,确保在处理大量并发请求时具备更好的性能和稳定性。 在8.5.x系列中,Tomcat 8.5.66包含了多项改进和修复,以提升安全性和性能。这...
在下载和安装"apache-tomcat-7.0.11-windows-x86"后,用户需要按照以下步骤操作: 1. 解压缩文件:将下载的压缩包解压缩到一个合适的目录,如"C:\Program Files"或自定义的位置。 2. 配置环境变量:将Tomcat的bin...
这里提到的`tomcat-juli.jar`、`tomcat-juli-adapters.jar`和`log4j-1.2.12.jar`是与Tomcat日志输出密切相关的组件。 1. **tomcat-juli.jar**: Tomcat JULI(Java Util Logging Implementation)是Tomcat自定义的...