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。後者を使用していた場合、これはすでに自動的に考慮されているためです。

RequestDispatcher#forward()通常のサーブレット API の方法でFORM ベースの認証ログイン ページが表示されます。したがって、最初に要求されたページの要求 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 に答える