0

ユーザーがログインしているかどうかを確認し、ログインしていない場合はユーザーをログイン ページにリダイレクトするサーブレット フィルターを実装しました。このチェックをフィルターとして行っている理由は、ログイン ページが別の Web アプリケーションに存在し、web.xml の FROM auth-method を使用して別のコンテキスト ルートを持つ別の Web アプリケーションにあるページにリダイレクトできないように見えるためです。 (注、私はweblogic 11gを使用しています)。

私が経験している問題は、ボタンなどの ajax 化されたコンポーネントがある場合、サーブレット フィルターがユーザーをリダイレクトできないことです。つまり、元のページに戻ってしまいます。

このログインチェックを行う別の方法はありますか?

4

1 に答える 1

2

RESTORE_VIEW フェーズの前に実行される JSF 2.0 フェーズ リスナーとして、サーブレット フィルターを再実装しました。ロジックを Phase Listener に移動することで、AJAX 要求のリダイレクトを処理する JSF の機能を利用することができました。基本的に、JSF 2.0 は適切な AJAX 応答を作成して、クライアント側でリダイレクトを引き起こします。明確にするために、このメカニズムは、ユーザーがログインしていない場合、AJAX および非 AJAX 要求のリダイレクトを実行できます。

具体的には、次の応答を返します。

<?xml version="1.0" encoding="utf-8"?>
<partial-response>
  <redirect url="/contextpath/faces/ajax/redirecttarget.xhtml">
  </redirect>
</partial-response>"

フェーズ リスナーのコード:

public PhaseId getPhaseId() 
{
    return PhaseId.RESTORE_VIEW;
}

public void afterPhase(PhaseEvent event) 
{
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    HttpSession session = (HttpSession)ec.getSession(false);

    if (session==null || session.getAttribute(IS_LOGGED_IN_INDICATOR) == null) 
    {
        try
        {
            ec.redirect(LOGIN_PAGE_URL);
        }
        catch(IOException e)
        {
            // log exception...
        }           
    }
}
于 2012-05-04T19:34:48.937 に答える