2

私の JavaEE アプリケーションでは、ユーザー認証に Apache Shiro[1] を使用しています。ユーザーは、「/company/index.xhtml?companyId=327」などの GET-URL を介してナビゲートしています。

BalusC のガイド [2] に従って、プログラムによるログインを有効にしました。

SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(Faces.getRequest());

私の問題は、私のケースがRememberMeの有無にかかわらず非同期POSTの場合、 savedRequest.getRequestUrl()に前述のGETパラメータが含まれていないことです。たとえば、「/company/index.xhtml」だけが返されます。"FacesAjaxAwareUserFilter" ([2] を参照) が GET-params に対応していないようです。すべてが同期 GET 呼び出しで正常に動作します。

「FacesAjaxAwareUserFilter」を使用する場合、認証が必要なため、shiro-redirect の後に GET パラメータを取得するにはどうすればよいですか?

[1] https://shiro.apache.org/

[2] JavaEE と Shiro に関する次の素晴らしい記事に従いました: http://balusc.blogspot.de/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html

4

1 に答える 1

4

JSF ajax リクエストは、 によって生成された URL に送信され<h:form>ます。ただし、これはデフォルトでは、クエリ文字列を含む現在の URL ではなく、クエリ文字列を除いた現在の URI です。

これを修正するにはいくつかの方法があります。最も単純だが最も醜い方法は、JS を使用することです。

<h:form id="foo">
    ...
</h:form>
<script>document.getElementById("foo").action += "?" + location.search;</script>

最もクリーンな方法は、クエリ文字列を含む目的の URL を返す( で使用される) カスタムViewHandlerを作成することです。getActionURL()<h:form>

JSF ユーティリティ ライブラリOmniFacesには、ビュー パラメーターに基づいてそれを行うコンポーネントが既にあり<o:form>ます。<h:form>includeViewParams="true"<h:link>

<f:metadata>
    <f:viewParam name="companyId" value="#{bean.company}" />
</f:metadata>
...
<o:form includeViewParams="true">
    ...
</o:form>
于 2013-02-07T11:24:01.977 に答える