我有一个 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
}
}