2011-09-29 31 views
2

我有一個由Java Servlet支持的Web服務。該服務由較舊版本的Flash使用。我們發現通過一些痛苦,在這個版本的Flash中,URLLoader不適用於分塊響應。從未從服務器接收任何分塊響應。禁止每個請求分塊

我使用Glassfish來託管Servlet。我知道如何禁用整個服務器的分塊,但這似乎是一個壞主意(是嗎?)。

是否有一種標準的方法來禁用每個請求的分塊?我試過打電話ServletResponse.setBufferSize(SOME_LARGE_VALUE),但令人驚訝的是這並未影響服務器使用分塊的決定。

+0

的可能的複製[如何禁用的Tomcat 6傳輸編碼(http://stackoverflow.com/questions/6299432/how-do-disable-transfer-encoding-in -tomcat-6) – Vadzim

回答

2

javadocHttpServlet#doGet()的:

...

如果可能的話,設置Content-Length頭(與ServletResponse.setContentLength(int)法),以允許servlet容器使用持久連接返回其迴應客戶,改善業績。如果整個響應適合響應緩衝區內容,則會自動設置內容長度。

當使用HTTP 1.1分塊編碼(意味着響應的標頭爲Transfer-Encoding)時,請不要設置Content-Length標頭。

...

所以,如果你設置響應內容長度事前,那麼它將不會在分塊編碼發送。

response.setContentLength(contentLength); 
// ... 

更新:您還需要確保該servlet是不是又被稱爲由<jsp:include>RequestDispatcher#include()。也its javadoc參見:

...

ServletResponse對象有其路徑元素和參數保持從主叫方的不變。包含的servlet無法更改響應狀態碼或設置標題;任何嘗試進行更改都將被忽略。

...

+0

這是有道理的,但它不適用於玻璃魚。即使設置了內容長度,服務器仍然會分塊。 –

+0

什麼Glassfish版本?您確定在*寫入任何內容之前設置了標題*嗎?你看到客戶端的頭文件嗎?你確定你沒有在被''或'RequestDispatcher#include()'調用的資源中設置頭文件(這將被完全忽略,另請參見[它的javadoc](http:// download .oracle.com/JavaEE的/ 6/API /的javax/servlet的/ RequestDispatcher.html#包括%28javax.servlet.ServletRequest,%20javax.servlet.ServletResponse%29))。 – BalusC

+0

GF 3.1;標題不顯示,我仍然看到「分塊」;不,我沒有寫任何內容之前設置標頭 –