ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトする 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
}
}