2015-09-09 76 views
0

我參考HttpServletResponsesendError方法:方面所解釋的官方文檔

void sendError(int sc, 
       java.lang.String msg) 
       throws java.io.IOException 

...和官方提供的文檔:

發送錯誤響應到使用指定狀態的客戶端並清除緩衝區。服務器默認創建對 的響應,看起來像包含指定的 消息的HTML格式的服務器錯誤頁面,將內容類型設置爲「text/html」。服務器將 保留Cookie,並可能清除或更新任何需要將 錯誤頁面作爲有效響應的標頭。如果錯誤頁面聲明的 已針對與狀態碼 相對應的Web應用程序進行傳入,則它將優先返回到建議的msg 參數,並且msg參數將被忽略。

如果響應已經提交 ,則此方法將引發IllegalStateException。 使用此方法後,應將響應視爲已提交且不應寫入的 。

任何人都可以請解釋什麼是「清除緩衝區」和「如果響應已經提交」是什麼意思?

回答

1

何謂「清空緩衝器」

代碼將response.resetBuffer()基本上重置響應身體的任何書面和未刷新數據。


和 「如果響應已經提交」?

如果響應頭已經發送到客戶端。這是一個不歸路。服務器無法從客戶端收回已發送的數據並重新發送不同的響應。

的正常流動的一個例子是如下:

  1. 用戶請求JSP
  2. JSP寫入一些HTML來響應主體
  3. 在JSP文件的中間一些尷尬代碼拋出異常
  4. 服務器調用response.sendError(500)以便HTTP 500錯誤頁的HTML將被寫入
  5. 用戶看到HTTP 500錯誤頁面

但是,如果在步驟2和步驟3之間刷新了響應緩衝區(即,任何到目前爲止寫入的數據實際上都是從服務器發送到客戶端),那麼響應處於「已提交」狀態。這不能被重置。最終用戶基本上會得到表示該部分的半輸出HTML輸出,直到發生異常爲止。

這也是在JSP文件中執行業務邏輯不切實際的原因之一。另見a.o. How to avoid Java code in JSP files?

相關問題