2

我使用以下 web.xml 设置将未登录用户定向到 /faces/loginPage.xhtml。
在 /faces/loginPage.xhtml 中,我将对用户进行身份验证并将用户重定向到主页。

现在我想将用户重定向到她最初请求的页面,而不是主页。我怎么做?具体来说,如何获取最初请求页面的url?

<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>
4

1 回答 1

2

您似乎是通过 JSF 托管 bean 而不是通过j_security_check. 因为如果您使用后者,这已经被自动考虑在内。

基于 FORM 的身份验证登录页面以RequestDispatcher#forward()通常的 Servlet API 方式显示。因此,最初请求页面的请求 URI 可用作请求属性,其名称由 指定RequestDispatcher.FORWARD_REQUEST_URI,其值为"javax.servlet.forward.request_uri"

因此,在 EL 上下文中,它可以作为

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

在 JSF 上下文中,它可以作为

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

这需要在初始请求时收集,而不是在表单提交时收集。@ViewScoped最简单的方法是在附加到页面的托管 bean 的构造函数中获取它。使用 bean 的另一种方法@RequestScoped是在登录表单中使用该值包含纯 HTML<input type="hidden">并将其设置为@ManagedProperty.

于 2012-10-13T00:55:29.170 回答