2014-03-06 26 views
0

當在HttpServlet.doGet(...)我從HttpServletResponseOutputStream如何關閉HttpServletResponse的OutputStream中發送錯誤

resp.getOutputStream(); 

雖然寫的是輸出流時發生異常,而不是數據,我想送一錯誤返回

resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "My error message"); 

我該如何處理輸出流呢?

我可能必須關閉它。已寫入的數據是否發送到客戶端?我可以以某種方式丟棄該數據,以便客戶端只收到錯誤信息?

回答

0

enter image description hereenter image description here輸出流將被髮送到內容類型爲text/html的客戶端。

根據Java文檔。

使用指定的狀態向客戶端發送錯誤響應並清除緩衝區。服務器默認創建響應,使其看起來像包含指定消息的HTML格式的服務器錯誤頁面,並將內容類型設置爲「text/html」。

如果響應已被提交,則此方法將引發IllegalStateException。使用此方法後,應該認爲響應已提交,不應寫入。

您也可以爲web.xml中預定義的response.sendError()代碼設置錯誤頁面。

編輯:我已添加圖片。

+0

到目前爲止,我的觀察是:如果關閉流,我會得到IllegalStateException。如果我按原樣離開流(不關閉),並且只是調用sendError(),則客戶端無法回答(「沒有收到數據」)。所以我仍然不知道該怎麼做。 – Philipp

+0

如果你在調用sendError之前關閉了流,那麼你將得到一個IllegalStateException。如果你沒有關閉流,那麼如果沒有爲該特定的響應代碼配置錯誤頁面,sendError中的String參數用於向客戶端顯示消息。 – Arjit

+0

謝謝,我的問題是在正確設置郵件(從例外)... – Philipp

0

當發生一些異常時,它不會去客戶端。因爲你發送錯誤給客戶端而不是數據。

從Java文檔。

使用指定的狀態碼向客戶端發送錯誤響應並清除緩衝區。

所以客戶端將不會看到任何寫入的數據,並且您不應該關心已經寫入的數據。它會被清理乾淨。

+0

該文檔說:如果響應已被提交,則此方法拋出IllegalStateException。 「承諾」是什麼意思?我應該關閉流嗎? – Philipp

+0

這意味着如果您通過調用'res.flushBuffer()'將顯式刷新緩衝區的數據寫入客戶端,並且您嘗試再次使用該作者,它將拋出這種異常。或者響應自動刷新。 – Salah

相關問題