2009-08-13 42 views
1

感謝大家提前,與errorPage指令在Java Servlet過濾器的工作/ JSP

我已經覆蓋HTTPServletResponse收集頭,也把一個Servlet過濾器是需要這些頭,並設置他們使用他們的正確方法(例如:500 error code使用response.sendError(500))。我注意到,當這個過濾器在web.xml設置,從未使用的有errorPage集中的任何頁面,我收到的消息是沒有一個堆棧跟蹤The server encountered an internal error() that prevented it from fulfilling this request.還沒有被寫入正在發生的事情日誌的默認的Tomcat 500消息。我已經驗證,過濾器和覆蓋HTTPServletResponse不拋出任何Exception。另一點值得注意的是,如果我註釋掉,我現在用的是sendError方法將使用指定的errorPage線,但隨後狀態代碼設置爲200。再次

感謝,

山姆

回答

1

好了,#sendError方法不specifiy,您的自定義錯誤頁將被使用。它指定錯誤條件立即發送到客戶端並在最後刷新響應緩衝區。由於Servlet API比JSP API更通用,因此行爲取決於容器實現。在Servlet層中發送錯誤的最簡單方法是在使用#sendError(這是Tomcat所做的)時顯示容器的默認錯誤頁面。

一種解決方案是鏈中的請求/響應這麼servlet容器的響應處理器可以委託給您的自定義錯誤頁,而不是立即發送錯誤的。

+0

感謝您的答覆 - 我繼續這樣做,捕捉錯誤在我的過濾器,然後執行:的request.getRequestDispatcher(ErrorHandlerPath)的.forward(請求,響應),但仍不允許我設置在Status頭500,它允許我使用errorPage指令等,以規避但是當有異常被執行我的jsp頁面,一個狀態200仍然會發送。有任何想法嗎? – 2009-08-16 00:04:16

+0

你可以使用HttpServletResponse#setStatus(int)。容器必須選擇一個配置的錯誤頁面。 – cafebabe 2009-08-18 06:53:31

+0

.setStatus()才真正適用於成功請求,錯誤將覆蓋它(一些?/最?)容器 – jayshao 2010-07-14 21:35:53