JSF HTTP Session timeout,如果不加处理,会跳到错误页面
一般项目要求我们需要跳转到首页
java code:
package org.test.web;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.servlet.http.HttpSession;
public class PhaseListener implements javax.faces.event.PhaseListener {
public static final String PHASE = "PHASE";
private static final String homepage = "index.jsp";
public void afterPhase(PhaseEvent event) {
reportPhase(event, true);
}
public void beforePhase(PhaseEvent event) {
// reportPhase(event, false);
FacesContext context = event.getFacesContext();
ExternalContext ext = context.getExternalContext();
HttpSession session = (HttpSession) ext.getSession(false);
boolean newSession = (session == null) || (session.isNew());
boolean postback = !ext.getRequestParameterMap().isEmpty();
boolean timedout = postback && newSession;
if (timedout) {
Application app = context.getApplication();
ViewHandler viewHandler = app.getViewHandler();
UIViewRoot view = viewHandler.createView(context, "/" + homepage);
context.setViewRoot(view);
context.renderResponse();
try {
viewHandler.renderView(context, view);
context.responseComplete();
} catch (Throwable t) {
throw new FacesException("Session timed out", t);
}
}
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
private static final String tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
private void DumpView (FacesContext ctx, UIComponent p, int lvl) {
System.out.print (tabs.substring(0, lvl + 1));
System.out.println (p.getClass().getName()+": "+p.getClientId(ctx)+" "+p.getId());
for (UIComponent c : p.getChildren()) {
DumpView(ctx, c, lvl + 1);
}
}
private void DumpView (FacesContext ctx) {
UIViewRoot r = ctx.getViewRoot();
System.out.println ("ROOT children "+r.getChildCount());
DumpView(ctx, r, 0);
}
private void reportPhase (PhaseEvent event, boolean after) {
HttpSession session = (HttpSession) event.getFacesContext().getExternalContext().getSession(false);
if (session != null) {
if (after && event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
session.removeAttribute(PHASE);
} else {
if (!after) session.setAttribute(PHASE, event.getPhaseId());
}
}
if (!after && event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
//DumpView(event.getFacesContext());
}
//System.out.println ("**********************"+(after ? "AFTER " : "BEFORE ")+event.getPhaseId()+" session="+session); System.out.flush();
}
}
faces-config.xml
<lifecycle> <phase-listener>org.test.PhaseListener</phase-listener> </lifecycle>