3

ログインページに JSF1.2 を使用しています。ユーザーがログイン ページに長時間留まり (タイムアウトの状況)、ID とパスワードを入力しようとすると、ViewExpired エラーで失敗します (ID/パスワードが正しい場合でも)。これはすべて、JSF の観点から私には理にかなっています。私の解決策は、単純に Client for javax.faces.STATE_SAVING_METHOD を使用することでした。しかし、それはハックのように感じます。

私のアプリは JSF2.0 に移行しています。アプリが STATE_SAVING_METHOD のためにサーバーに戻るようにしたいと考えています。しかし、私の要件は、適切な ID とパスワードが送信された場合、そのアプリがそれを受け入れることです。

私のもう 1 つの解決策は、単純にサーブレットを使用し、ログイン処理に JSF を使用しないことです。しかし、JSF2.0 へのすべてのアップグレードにより、現在利用できるものがあるようです。

どんなアイデアでも大歓迎です。 ありがとうございました。

4

3 に答える 3

3

postback中に復元されたビューが返されたときに、ビューを手動で作成および構築できます。カスタムでこれを行うことができます。キックオフの例を次に示します。nullViewHandler

public class RestorableViewHandler extends ViewHandlerWrapper {

    private ViewHandler wrapped;

    public RestorableViewHandler(ViewHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public UIViewRoot restoreView(FacesContext context, String viewId) {
        UIViewRoot restoredView = wrapped.restoreView(context, viewId);

        if (!(restoredView == null && context.isPostback())) {
            return restoredView;
        }

        UIViewRoot createdView = createView(context, viewId);
        context.setViewRoot(createdView);

        try {
            getViewDeclarationLanguage(context, viewId).buildView(context, createdView);
        } catch (IOException e) {
            throw new FacesException(e);
        }

        return createdView;
    }

    @Override
    public ViewHandler getWrapped() {
        return wrapped;
    }

}

がログイン ページを表しているif場合は、チェックを追加してチェックを拡張することもできます。viewId

実行するには、次のように に登録しますfaces-config.xml

<application>
    <view-handler>com.example.RestorableViewHandler</view-handler>
</application>

ただし、技術的な制限があります。再作成されたビューは最初のリクエスト時とまったく同じです。そのため、タグハンドラによって、または一部のビューまたはセッション スコープ変数に基づいて条件付きでレンダリングされたコンポーネントによって、その後行われた JSF コンポーネント ツリーへの変更、完全に失われます。目的のビューを正確に再作成するには、これらの変更が、ビューまたはセッション スコープの変数ではなく、リクエスト スコープの変数 (つまり、リクエスト パラメーター) に基づいて行われていることを確認する必要があります。

つまり、ビューの状態は、ビューまたはセッション スコープのマネージド Bean に依存するのではなく、純粋にリクエスト スコープのマネージド Bean に依存する必要があります。


更新: OmniFaces<o:enableRestorableView> JSF ユーティリティ ライブラリには、現在の 1.3 スナップショットに、組み込み可能なフレーバーの再利用可能なソリューションがあり<f:metadata>ます。デモについては、<o:enableRestorableView>スナップショット サイトのショーケース ページも参照してください。

于 2012-09-25T15:57:43.987 に答える
0

使用できるいくつかのオプションを次に示します。

セッションがタイムアウトした後にユーザーがログインできるようにする JSF 2.0

(PrimeFaces の使用にオープンな場合は、使用できるコンポーネントがあります。) http://www.primefaces.org/showcase/ui/idlemonitorHome.jsf

于 2012-09-26T12:03:11.943 に答える