zoukankan      html  css  js  c++  java
  • [转]http返回头中contentlength与TransferEncoding: chunked的问题释疑

     

    原地址:http://www.blogjava.net/anchor110/articles/336371.html

    http返回头中content-length与Transfer-Encoding: chunked的问题释疑

    先说说问题出现的背景:

    公司服务器与手机客户端交互,客户端请求一个动态生成的XML文件,在用firebug查看http响应头的时候,有时候发现有content- length属性,有时候没有这个属性,取而代之的是Transfer-Encoding: chunked属性。由于客户端强制要求,服务器端必须返回content-length,否则,客户端将不予解析。于是测试发现,当XML文件很小的时 候,是有content-length属性的,到达一个值时,就成了Tansfer-Encoding:chunked。

    再引用一段话,解释一下Transfer-Encoding:chunked这个属性的意义:

    通常,HTTP协议中使用Content-Length这个头来告知数据的长度。然后,在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

    如果要一边产生数据,一边发给客户端,WEB 服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。

    最后说说自己的理解与解决方式:

    通过种种迹象,我得出的结论是,JSP页面有一个缓存大小,当输出数据的长度没有到达这个大小的时候,服务器是知道总的数据长度的,所以服务器会输出 content-length头。但如果超过缓存大小,那么,缓存一满,服务器就得输出内容给客户端,所以,不能判断整个内容的大小,于是返回 Transfer-Encoding:chunked这个头信息。

    解决方式是:在JSP页面中加入代码,response.setBufferSize(402800);40820即400K,其实只要这个值大于你返回的数据的大小就行了。具体设置多少,你可以根据实际情况,合理配置。另外说一句,在page指令中加入buffer="400kb",是不管用的,我测试 的情况是这样。

    注解:

    当使用Transfer-Encoding: chunked时,传送的实际长度将放到实际内容的首行,如以下这个列子,b就是实际的长度

    HTTP/1.1 200 OK

    Server: Apache-Coyote/1.1

    Set-Cookie: JSESSIONID=8A7461DDA53B4C4DD0E89D73219CB5F8; Path=/

    Content-Type: text/html;charset=UTF-8

    Transfer-Encoding: chunked

    Date: Wed, 10 Nov 2010 07:10:05 GMT

    b

    helloworld!

    3

    123

    0

  • 相关阅读:
    浅入ABP(1):搭建基础结构的 ABP 解决方案
    浅入ABP(2):添加基础集成服务
    GDB 调试 .NET 程序实录
    浅入 ABP 系列(6):数据库配置
    浅入 ABP 系列(4):事件总线
    浅入 ABP系列(3):增加日志组件、依赖注入服务
    模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
    RabbitMQ与Kafka选型对比
    .Net在Windows上使用Jenkins做CI/CD的那些事
    Tomcat乱码问题
  • 原文地址:https://www.cnblogs.com/foxhengxing/p/2272387.html
Copyright © 2011-2022 走看看