- 生產(chǎn)環(huán)境服務(wù)器規(guī)劃如下
服務(wù)器 | 類型 | 網(wǎng)絡(luò)環(huán)境 |
---|---|---|
cal.com | nginx | 外網(wǎng) |
192.168.7.15:9200 | tomcat | 內(nèi)網(wǎng) |
192.168.7.16:9200 | tomcat | 內(nèi)網(wǎng) |
sdd.com | nginx | 內(nèi)網(wǎng) |
192.168.7.15:9100 | tomcat | 內(nèi)網(wǎng) |
192.168.7.16:9100 | tomcat | 內(nèi)網(wǎng) |
192.168.7.15和192.168.7.16是做個負載均衡。目前的需求是用戶訪問外網(wǎng)的cal.com 返回 內(nèi)網(wǎng) 192.168.7.15:9200 和 192.168.7.16:9200的頁面,數(shù)據(jù)需要再次請求sdd.com,sdd.com轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的
192.168.7.15:9100 和 192.168.7.16:9100。
請求的流程圖如圖所示:
- 問題描述
在cal.com上線后,用戶發(fā)起請求,發(fā)現(xiàn)9200端口上的靜態(tài)頁面請求可以返回,而ajax請求數(shù)據(jù)無法返回,所有的ajax請求是做了代理的,代理到了sdd.com。既然能返回靜態(tài)頁面數(shù)據(jù),說明肯定不是cal.com對應(yīng)的服務(wù)器問題,而是在sdd.com這一環(huán)節(jié)存在問題,通過添加日志輸出,發(fā)現(xiàn)可以正常請求回來數(shù)據(jù),并寫入到響應(yīng)體中去,但是前端一直請求錯誤。
- 解決
首先通過增加日志打印,排查方法的哪一步出現(xiàn)了問題,因為9200的tomcat服務(wù)器所有的靜態(tài)資源是可以正常返回的,這排除了服務(wù)器問題,比較離奇的時候,所有的日志打印地方都可以正常輸出,可以正常請求到sdd.com的結(jié)果,但是就是返回不了數(shù)據(jù),這一步至少確定了 從9200發(fā)送sdd.com是沒問題的。那么繼續(xù)再排查其他原因,經(jīng)過多次的代碼反復(fù)注釋,發(fā)現(xiàn)9200設(shè)在設(shè)置響應(yīng)頭的這一步出現(xiàn)了問題,具體的就是只要有Transfer-Encoding : chunked 就會導(dǎo)致瀏覽器報錯。
經(jīng)過分析此請求頭發(fā)現(xiàn),只要響應(yīng)頭中攜帶了這個Transfer-Encoding : chunked 標頭,瀏覽器就會報錯,只要一去掉,就不會報錯。后來得知Transfer-Encoding 這是一種傳輸編碼方式,如果存在這個標頭,則表示服務(wù)器無法一次性計算出本次響應(yīng)的content-length,需要將響應(yīng)內(nèi)容類型分段傳輸/分塊傳輸給客戶端,每一塊都需要用一個十六進制的長度表示當前塊傳輸內(nèi)容的字節(jié)大小,當客戶端收到最后一個塊的大小為0時,表示此次請求完整的結(jié)束了。
錯誤代碼:
clientHttpResponse.getHeaders().forEach((key, value) -> value.forEach(it -> {
response.setHeader(key, it);
}));
這里面的關(guān)鍵就是 response.setHeader(key, it); 給tomcat請求設(shè)置響應(yīng)頭 Transfer-Encoding :chunked ,但是實際的響應(yīng)體數(shù)據(jù)格式卻不是chunked 分塊格式,這就導(dǎo)致了cal.com nginx服務(wù)器在接收到tomcat服務(wù)器的響應(yīng)時根本無法處理成功,進而給瀏覽器也報錯了。
這里由于sdd.com這臺nginx服務(wù)器,開啟了傳入編碼后文章來源:http://www.zghlxwxcb.cn/news/detail-614931.html
location / {
chunked_transfer_encoding on;
}
9200端口發(fā)送請求的工具類收到sdd.com返回的數(shù)據(jù)以后,進行了正確的格式解析,此時已經(jīng)獲取到了完整的響應(yīng)體數(shù)據(jù),那么這時候如果再按照sdd.com的響應(yīng)頭信息去給cal.com傳輸?shù)脑挘统霈F(xiàn)問題了,因為格式明明是完整的,而響應(yīng)頭卻設(shè)置了 Transfer-Encoding : chunked 。這就導(dǎo)致匹配不起來了。文章來源地址http://www.zghlxwxcb.cn/news/detail-614931.html
到了這里,關(guān)于Http 響應(yīng)頭 Transfer-Encoding : chunked 導(dǎo)致 瀏覽器客戶端請求錯誤問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!