2012-10-12 97 views
2

我使用以下web.xml設置將未登錄的用戶定向到/faces/loginPage.xhtml。
在/faces/loginPage.xhtml我將驗證用戶並將用戶重定向到主頁。如何獲取最初請求的頁面的網址?

現在我想將用戶重定向到她最初請求的頁面,而不是主頁。我怎麼做?具體來說,如何獲取最初請求的頁面的網址?

<security-constraint> 
    <display-name>MyConstraint</display-name> 
    <web-resource-collection> 
     <web-resource-name>wrcoll</web-resource-name> 
     <description /> 
     <url-pattern>/faces/secured/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description /> 
     <role-name>myUser</role-name> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>my_ldap_domain</realm-name> 
    <form-login-config> 
     <form-login-page>/faces/loginPage.xhtml</form-login-page> 
     <form-error-page>/error.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
+0

詳細答案在這裏 [http://stackoverflow.com/questions/8024344/user-login-with-jsf-2-0/39379256#39379256](http://stackoverflow.com/questions/8024344/user-login-with-jsf-2-0/39379256#39379256) –

回答

2

您似乎正在通過JSF受管bean執行登錄,而不是通過j_security_check執行登錄。因爲如果你使用後者,這已經被自動考慮了。

基於FORM認證登錄頁面被一個RequestDispatcher#forward()通常的Servlet API的方式顯示。因此,作爲由RequestDispatcher.FORWARD_REQUEST_URI,其中有"javax.servlet.forward.request_uri"值指定的最初請求頁面的請求URI可與名稱的請求屬性。

所以,在EL背景下它可作爲

#{requestScope['javax.servlet.forward.request_uri']} 

而且在JSF方面它可作爲

String originalURL = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("javax.servlet.forward.request_uri"); 

這需要對初始請求被收集,而不是形式提交。最簡單的方法是在連接到該頁面的管理bean的@ViewScoped的構造函數中獲取它。用@RequestScoped豆的替代方案是在與登錄表單該值以包圍一個普通的HTML <input type="hidden">並將其設置爲@ManagedProperty

+0

謝謝BalusC! –

+0

不客氣。 – BalusC

相關問題