【问题标题】:how to get the url of the initially requested page?如何获取最初请求页面的 url?
【发布时间】:2012-10-03 19:50:19
【问题描述】:

我使用以下 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>

【问题讨论】:

标签: jsf jsf-2


【解决方案1】:

您似乎是通过 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 的构造函数中获取它。使用@RequestScoped bean 的另一种方法是在登录表单中使用该值将纯HTML &lt;input type="hidden"&gt; 括起来,并将其设置为@ManagedProperty。

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多