2010-10-01 26 views
3

我有一個請求調度程序包含另一個servlet的servlet。Servlet在Tomcat中包含吞吞HTTP頭文件

包含的servlet設置我想在中讀取的標題,包括 servlet。所以我在include()方法中傳入了一個自定義的HTTPResponse對象,該方法捕獲了servlet中的所有反饋活動。

問題是在我的自定義響應中未設置標題。我在調試中運行並檢查了看起來像Tomcat使用自己的響應對象封裝自定義響應對象的情況。 setHeader調用轉到這個包裝類,並且永遠不會傳播到我的自定義響應對象。

我想Tomcat會這樣做,以保護客戶端不被錯誤地址設置。有趣的是,同樣的方法以我期望的方式在Jetty中運行。

這是一段時間,因爲我認真對待Servlets,所以我在這裏掙扎了一下。我試圖弄清楚如何從通過dispatcher.include()調用的servlet讀取響應頭。

回答

4

從servlet規範部分SRV.8.3:

的包括RequestDispatcher的接口的方法可在任何時間被調用。 包含方法的目標servlet可以訪問請求的所有方面 對象,但其使用響應對象更受限制。

它只能將信息寫入到 響應對象的ServletOutputStream的或寫入器和提交通過寫入內容過去 響應緩衝區的末尾,或通過顯式調用 ServletResponse的接口的flushBuffer方法的響應。

它不能設置標題或調用影響 響應標題的任何方法。任何企圖這樣做必須忽略

如何在請求範圍中爲調用servlet設置值,使用request.setAttribute(...),然後在返回時從那裏讀取它?這可以工作嗎?

+0

換句話說,Jetty做錯了。 – BalusC 2010-10-01 20:24:35

+0

謝謝你澄清我的行爲。你知道我想過使用request.setAttribute()。這將起作用,並且我將它作爲計劃B保留下來,因爲在D.R.Y的意義上它不是最優的。我需要訪問內容類型和內容長度以傳播到包含的servlet。使用請求屬性強制冗餘。但是,包含的servlet *需要重構。再次感謝! – Cliff 2010-10-04 02:33:27

+0

如果我將包含* servlet的servlet轉換爲可以工作的Filter?我的意思是,在由Filter調用的Servlet中編寫頭文件時,是否違反了spec規範? – Cliff 2010-10-04 02:35:48