1

ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトする JSF Phase Listerner があります。これは、非 ajax リクエストに対しては正常に機能しています。ただし、ユーザーがページにいる場合、私の場合はprimefacesデータテーブルがあり、ajaxリクエストを呼び出すボタンをクリックすると、セッションがタイムアウトになり、リダイレクトを発行するコードが実行されます( を使用ExternalContext#redirect)、ただし、ユーザーはログイン ページに移動しません。

なぜこれが機能しないのですか?

これが私のフェーズリスナーです:

private static final String IS_LOGGED_IN_INDICATOR = "loggedIn";
private static final String LOGIN_PAGE = "/login.jsp";

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

public void beforePhase(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);
       }
       catch(IOException e) {
           // log exception...
       }            
    }
}

public void afterPhase(PhaseEvent event) {
    // no-op
}   

}

4

2 に答える 2

3

ビュー ルートがまったくないにもかかわらず、ajax コンテキストがビュー ルートからレンダー キットを取得しようとしているため、失敗しました。その時点ではまだ復旧していません。これによりNullPointerExceptionPartialViewContext#createPartialResponseWriter(). この例外はスローされず、カスタムによって処理されるはずの ajax 例外キューに入れられますExceptionHandler。あなたは明らかに誰も持っていません。この例外は、のようなものを作成/使用する場合に表示されますFullAjaxExceptionHandler(詳細については、このブログも参照してください)。

afterPhase()特定の問題を解決するには、代わりにジョブを実行してください。その後、ビュー ルートが完全に復元され、ajax コンテキストはそこからレンダー キットを取得して、JavaScript で JSF ajax エンジンにウィンドウの場所を変更するように指示する特殊な XML 応答を書き込むことができます。Ajax がなければ、リダイレクトは基本的には応答ヘッダーを設定するだけなので、レンダー キットは必要ありませんでした。

その特定NullPointerExceptionが Mojarra のバグであるかどうかは別の質問であり、独自の問題トラッカーで問題レポートのフレーバーに投稿する方がよいでしょう。

于 2012-06-22T04:22:23.863 に答える
-1

これは、リダイレクトを行うために Ajax リクエストに対して XML で特別な応答を送信する必要があるためです (この回答を確認してください)。これを次のようなフィルターに実装しました。

// Check if it's an Ajax Request 
if ("partial/ajax".equals(((HttpServletRequest) request).getHeader("Faces-Request"))) {
      //redirect 
      response.setContentType("text/xml");
      response.getWriter()
           .append("<?xml version=  \"1.0\" encoding=\"UTF-8\"?>")
           .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>",url);

これを Phase Listener に移植する必要があります。

于 2012-06-21T19:09:26.483 に答える