1

何年もの間、ログイン後にアプリケーションのウェルカムページに移動しないことがある理由に戸惑いました。私はついにそれを理解しました(他のみんなから数年後):

  • j_security_checkで正常にログインし、ウェルカムページに移動します

  • セッションタイムアウトを待つ

  • GETリクエストを送信するh:linkをクリックします

  • これはGETであり、POSTではないため、カスタムViewExpiredException
    ハンドラーは起動しません


  • セッションがタイムアウトしたため、コンテナセキュリティはログインページにリダイレクトします。セッションタイムアウト+コンテナセキュリティのため、(h:linkからの)getリクエストは、フェーズリスナーまたはフィルターのいずれかでアプリケーションに表示されません。

  • 再度ログインに成功しました

  • j_security_checkは、
    認証をトリガーしたページ(この場合はGETリクエストのターゲット)にリダイレクトします。

私が理解していなかった最後のビットは、それが常にウェルカムページに行くだろうと思いました。

私の問題は、現在の設計では、ログイン後に常にウェルカムページを表示する必要があることです。ウェルカムページにはpreRenderViewイベントがあり、ログイン後にセッションスコープのBeanにコンテキスト情報を設定し、いくつかのカウンターなどをインクリメントします。

このコンテキスト情報は、他のページのBeanコードをサポートするために必要です。現在、最初にウェルカムページを通過しないと、例外が発生します。

それを修正するという点で、私は次のオプションを見てきました:

  1. 理想的には、呼び出すことができる@PostLoginメソッドがあり、それによって私のすべての問題がきれいに解決されます。Myfaces CODIでJSF(Mojarra)を使用していますが、希望どおりの動作をするものが見つかりません。

  2. フィルタにコードを追加することもできますが、データ(ログイン数など)を保持する必要があります。これは適切なオプションのようには見えません。たぶん私は間違っています。

  3. j_security_checkの潜在的なターゲット(GETで呼び出されるページ)のすべてのpreRenderViewメソッドが、j_seecurity_checkから直接呼び出される場合を処理するようにします。これが私がしなければならないことであることがわかりますが、それは多くの面倒のようです。

  4. j_security_checkの動作をオーバーライドするために、glassfish用のサーバー認証モジュールを作成します。

これは通常どのように処理されますか?何年にもわたってPOSTを悪用した後、単純なナビゲーションケースのGETに移行した後、この問題が発生し始めました。カスタム例外ハンドラーが機能しません。誰かがこの問題について何かガイダンスを持っているなら、私はそれを感謝します、少なくとも私は今何が起こっているのか知っています。うまくいけば、私は明らかな何かを逃しました!

ありがとうO/S

4

1 に答える 1

2

理想的には、呼び出すことができる@PostLoginメソッドがあり、それによって私のすべての問題がきれいに解決されます。Myfaces CODIでJSF(Mojarra)を使用していますが、希望どおりの動作をするものが見つかりません。

確かにそのようなことはありません。


フィルタにコードを追加することもできますが、データ(ログイン数など)を保持する必要があります。これは適切なオプションのようには見えません。たぶん私は間違っています。

それは確かに「最も簡単な」方法でしょう。基本的に:

UserPrincipal user = request.getUserPrincipal();
HttpSession session = request.getSession();

if (user != null && session.getAttribute("user") == null) {
    session.setAttribute("user", user);

    // First-time login. You can do your intercepting thing here.
    response.sendRedirect(request.getContextPath() + "/welcome.xhtml");
}

j_security_checkの潜在的なターゲット(GETで呼び出されるページ)のすべてのpreRenderViewメソッドが、j_seecurity_checkから直接呼び出される場合を処理するようにします。これが私がしなければならないことであることがわかりますが、それは多くの面倒のようです。

それはDRYではありません。


j_security_checkの動作をオーバーライドするために、glassfish用のサーバー認証モジュールを作成します。

私はそれをしたことがないので、それに答えることはできません。

于 2012-05-10T18:41:35.747 に答える