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...
}
}
}