我們的servlet過濾器鏈中有一個過濾器,它在發送401錯誤時將請求轉發到登錄頁面,作爲可用性調整。如何從Jetty處理程序轉發到另一個URL?
我試圖將其轉換爲Jetty處理程序,因爲有人希望所有Web應用程序都由相同的邏輯進行身份驗證,而不是每個Web應用程序都必須執行自己的身份驗證。
(我們首先使用過濾方法的主要原因是,沒有人能夠獲得Jetty的容器級別身份驗證 - 我們可以選擇Windows身份驗證或內置身份驗證和希望能夠在運行時它們之間進行切換,並始終沒能搞清楚如何使碼頭的工作)
在外面的碼頭處理程序,有一些像這樣的邏輯:
private void handleErrorBetter(HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
throws ServletException, IOException {
if (isPageRequest(servletRequest)) {
ServletContext rootContext = servletRequest.getServletContext().getContext("/");
RequestDispatcher dispatcher = rootContext.getRequestDispatcher("/sign_in");
dispatcher.forward(servletRequest, servletResponse);
} else {
// ...
}
}
servletRequest.getServletContext()
似乎正確地返回/
的上下文。有趣的是,即使我提出了一個不同的Web應用程序的請求,似乎這樣做,但根據Javadoc我必須使用getContext("/")
來確保我獲得了根環境,所以我正在這樣做。
調度程序也成功。
然後我打電話給forward()
,這總是返回一個404響應給客戶端。
如果我直接從網絡瀏覽器訪問/sign_in
,表單會加載。
服務器上只有兩個上下文:根環境/
和/sample/
上下文,我正在使用它來測試第二個webapp。所以我知道/sign_in
將在根上下文中,但爲什麼forward()
轉發給它時會給出404?
這是什麼運氣?我看到了我的應用程序在碼頭7.6.4上的類似行爲。 – Andrew 2012-08-07 18:35:00
最終我最終爲Jetty做了一個黑客來解決這個bug,但是它看起來像Wicket正在分別開發一個解決方法,所以只需要先發佈一個帶有修補程序的版本。 – Trejkaz 2012-08-10 03:41:44