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",是无论用的,我测试的状况是这样。缓存

相关文章
相关标签/搜索