2010-08-27 49 views
1

我有一個用於提供php和靜態web文件的apache web服務器。爲了使用Active Directory身份驗證,我編寫了一些代碼,可以通過JNDI連接到AD並驗證用戶名密碼和組。我想要的是通過我的servlet將所有請求映射到apache中的頁面,以確保存在有效的會話,然後如果他們必須再次登錄,他們有正確的AD組才能訪問特定的URL。我的問題是,當我使用/ *將我的servlet映射到每個url時,它無法將請求轉發到我嘗試獲取的實際頁面。它只是將請求轉發到我的servlet並調用它的doGet方法,直到發生一個servlet異常。我想要透明代理的功能,但我似乎無法從中獲得。有沒有人有任何透明代理servlet的具體例子,或者知道用servlet來做到這一點的方法。 servlet的轉發功能似乎使它成爲完美的工具,但我似乎被卡住了。作爲Apache Web服務器代理的Java servlet

過濾代碼

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest)request; 
    HttpServletResponse res = (HttpServletResponse)response; 
    boolean authenticated = false; //should be false when testing is done. 
    //skip if its the login page 
    if(req.getRequestURI().equals("/auth/login.jsp") || authenticated){ 
     chain.doFilter(req, res); 
    }else{ 
     req.setAttribute("protectedUrl", req.getRequestURI()); 
     res.sendRedirect("/auth/login.jsp"); 
    } 
} 

Web.xml中

(snip) 
<filter-mapping> 
    <filter-name>SessionFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
+0

當您嘗試轉發請求時,您會收到什麼錯誤?您是否記得將端口號更改爲Apache正在監聽的端口? – TMN 2010-08-27 16:01:10

+0

我還沒有在Apache中實現轉發。我只是在部署了servlet的jboss服務器上運行示例。我收到的錯誤是一個Servlet異常,堆棧跟蹤只是對我的servlet的doGet方法的一長串調用。我相信這是因爲servlet映射到/ *而發生的。如上所述,我希望所有的URL都先通過servlet。我沒有看到任何其他方式來設置頁面,所以發生這種情況。 – 2010-08-27 16:08:27

回答

1

由於Servlet上/*映射的,因此RequestDispatcher#forward()將再次調用它,從而導致無限循環,最後一個StackOverflowError(或一些其他異常取決於所討論的servletcontainer,它可能有一些遞歸抑制內置函數,它會在一定數量的遞歸調用之後進行)。

畢竟,Servlet並不是完全適合這份工作的正確工具,您寧可在這裏使用Filter。執行javax.servlet.Filter並在doFilter()方法中執行相同的工作。當映射到/*時,它不會自動調用自身,因爲它默認僅在請求上進行偵聽,而不是在轉發或包含進程中進行偵聽。

+0

好的。因此,如果我在過濾器中進行身份驗證,則可以使用我的登錄信息添加請求參數。但我想要的是能夠轉發用戶到登錄頁面,如果他們的信息是無效的或未經授權的。那麼我應該將原始requestURI保存在一個變量中,並將請求位置設置爲登錄頁面? – 2010-08-27 17:47:15

+0

請勿將其保存爲變量。該過濾器由所有用戶共享。而是將其作爲請求參數傳遞或設置爲請求屬性。然後,在登錄頁面中有一個隱藏字段,您可以在其中設置參數/屬性值。 – BalusC 2010-08-27 18:15:21

+0

好的。我編輯我的代碼示例以我現在要做的事情。但由於某種原因,它只是不斷嘗試加載/auth/login.jsp並且不跳過篩選器。我檢查了調試器,request.getRequestURI返回了/auth/login.jsp,所以它應該跳過剩下的filter.doFilter過濾器吧? – 2010-08-27 18:40:02