我将 servlet 过滤器重新实现为在 RESTORE_VIEW 阶段之前运行的 JSF 2.0 阶段侦听器。通过将逻辑移到 Phase Listener 中,我能够利用 JSF 处理 AJAX 请求重定向的能力。基本上,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...
}
}
}