碼上歡樂
首頁
榜單
標簽
關於
搜索
相關內容
簡體
繁體
HTTP 響應頭信息(Http Response Header) Content-Length 和 Transfer-Encoding
本文轉載自
查看原文
2014-05-29 14:39
6549
HTTP
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。
從以上幾種情況可以看出,一旦調用了out.flush,buffer就被重置了,Content-Length就無法計算了,Repsonse Header必然是Tansfer-Encoding:chunked。
×
免責聲明!
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。
猜您在找
Tomcat 中響應頭信息(Http Response Header) Content-Length 和 Transfer-Encoding
【HTTP協議】響應頭中的Content-Length和Transfer-Encoding
Http請求的響應沒有Content-Length,只有Transfer-Encoding→chunked
PHP header函數設置http報文頭示例詳解以及解決http返回頭中content-length與Transfer-Encoding: chunked的問題
Content-Length和Transfer-Encoding詳解
http返回頭中content-length與Transfer-Encoding: chunked的問題釋疑
Http Header的Transfer-Encoding
http 響應頭---content-length
HTTP協議響應頭之Transfer-Encoding:分塊傳輸詳解
Http協議中的CharacterEncoding、Content-Encoding和Transfer-Encoding
粵ICP備18138465號
© 2018-2025 CODEPRJ.COM