2012-02-29 38 views
6

在今天下午解決了一個問題之後,我一直在挖掘網絡@工作中,添加到HttpServletResponse中的Cookie沒有正確地反映在響應頭中,因爲我們的Servlet已經獲取了響應的PrintWriter(即response.getWriter() )在我們添加cookie之前。我現在意識到,最佳實踐要求響應頭修改(即設置內容類型,添加/編輯Cookie等)必須在調用getWriter()之前完成,但是我正在尋找的是:爲什麼?爲什麼不能在調用getWriter()之後更新HttpServletResponse頭文件?

我們一直在推測爲什麼檢索PrintWriter實際上凍結了響應頭,但爲什麼Servlet規範強制實施呢?

回答

11

SRV.5.2頭的的Java™Servlet規範版本2.4

要成功傳送回客戶端,頭必須設置響應致力於 之前。提交響應之後設置的標頭將被 忽略,由servlet容器。

所以規範沒有明確提到getWriter()對設置標題有影響。

但是,您的servlet容器實現可能已選擇將響應視爲調用getWriter()後調用。這是微妙的不同。

在我與您一起工作的一些容器中,當您在響應完成後嘗試設置標題時,會記錄一條警告。

儘可能晚的呼叫getWriter()總是值得的,因爲您可能希望有機會設置字符編碼等,必須在調用getWriter()之前設置字符編碼等。

+0

謝謝保羅!這就說得通了。所以這可能是Tomcat過度關注何時考慮關閉修改的頭文件。我的錯誤是假設我們在調用out.flush()之前寫入響應主體的任何數據本質上是未提交的,但情況可能並非如此。再次感謝! – 2012-03-01 13:55:03

+0

可愛的答案,很好的參考。謝謝保羅。 – 2015-10-09 09:39:44

3

因爲標題在HTTP中位於主體之前。這就是爲什麼他們被稱爲「標題」。如果調用getWriter()函數寫入正文,那麼開始更改響應頭值就太遲了。

相關問題