2010-11-05 38 views
1

我的JSF應用程序將任何未登錄的用戶重定向到登錄頁面。當用戶登錄時,我希望應用程序重定向到用戶最初在瀏覽器的地址欄中輸入的頁面。但我不知道如何訪問用戶最初輸入的url,因爲他被自動重定向到我在web.xml中配置的登錄頁面。JSF 2.0:如何獲取在瀏覽器地址欄中輸入的URL

+0

所以,你正在使用容器管理的安全性,如'j_security_check'? – BalusC 2010-11-05 11:06:32

+0

是的,我正在使用容器管理的安全性。但是在登錄時,我使用HttpServletRequest.login(用戶名,密碼)而不是j_security_check。 – Theo 2010-11-05 11:09:57

+1

提示,使用像@ @ BalusC'這樣的@ @暱稱來通知其他人關於不屬於他們的帖子的評論。否則,你要看是否會在後面回顧主題(通常不會)。另見http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work – BalusC 2010-11-05 12:10:36

回答

5

容器管理的安全性沒有任何API提供的設施。最好的辦法是由Filter類做大致是這樣的,以取代<login-config>

HttpServletRequest httpreq = (HttpServletRequest) request; 
HttpServletResponse httpres = (HttpServletResponse) response; 
if (httpreq.getUserPrincipal() == null) { 
    httpreq.getSession().setAttribute("from", httpreq.getRequestURI()); 
    httpres.sendRedirect("login.jsf"); 
} else { 
    chain.doFilter(request, response); 
} 

,然後在登錄的事情:

request.login(username, password); 
externalContext.redirect((String) request.getSession().getAttribute("from")); 
+0

我只是挖了這個答案備份,思考[這個問題]的過濾器(http://stackoverflow.com/questions/4413407/)。很好的答案,當然。它真的很糟糕,沒有API - 這似乎是一個常見的用例。我很好奇:如果你從'web.xml'中刪除'','request.login(username,password)'仍然有效嗎?怎麼樣? – 2010-12-10 22:16:26

+0

@Matt:是的,它會工作。它只是新的Servlet 3.0程序化替換,它與''(與過濾器的''組合)相同。但是,您仍然需要將''條目和用戶/密碼/角色保持在一個領域。 – BalusC 2010-12-10 22:36:36

+0

如何在部署描述符中設置login-config以使其正常工作?如果我刪除表單身份驗證,則Web瀏覽器將request.userPrincipal設置爲緩存值,因此(httpreq.getUserPrincipal()== null)將爲false。如果我打開表單身份驗證,則自從容器接管後,根本不運行該過濾器。 – 2011-01-28 09:40:28

相關問題