如何监测和处理 session 超时?
——JSF 在 tomcat 中的 ViewExpiredException
从 JSF1.2 规范说明中,我们可以发现在恢复视图的生命周期时会抛出 ViewExpiredException异常,因此我们
可在恢复视图的生命周期前做一些处理。
通过一个 PhaseListener 监听器来处理异常。
package com.common;
import java.io.IOException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
public class SessionExpiredPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
public void afterPhase(PhaseEvent event) {
// Do nothing
}
public void beforePhase(PhaseEvent event) {
FacesContext facesCtx = event.getFacesContext();
ExternalContext extCtx = facesCtx.getExternalContext();
HttpSession session = (HttpSession)extCtx.getSession(false);
boolean newSession = (session == null)||(session.isNew());
boolean postback = !extCtx.getRequestParameterMap().isEmpty();
boolean timedout = postback && newSession;
if(timedout) {
try {
extCtx.dispatch("sessionExpired.jsp");
// 你可以在 web.xml 中配置页面并在这里获取页面
facesCtx.responseComplete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public PhaseId getPhaseId(){
return PhaseId.RESTORE_VIEW;
}
}
在 faces-config.xml 中配置监听器