2012-07-27 23 views
2

我們的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?

+0

這是什麼運氣?我看到了我的應用程序在碼頭7.6.4上的類似行爲。 – Andrew 2012-08-07 18:35:00

+0

最終我最終爲Jetty做了一個黑客來解決這個bug,但是它看起來像Wicket正在分別開發一個解決方法,所以只需要先發佈一個帶有修補程序的版本。 – Trejkaz 2012-08-10 03:41:44

回答

相關問題