JSF Session timeout的页面跳转处理(亲测可以用)

来源:互联网 发布:51单片机最小系统焊接 编辑:程序博客网 时间:2024/05/01 08:32

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();    }}


再去jsf部署定义文件修改下:

faces-config.xml
<lifecycle>       <phase-listener>org.test.PhaseListener</phase-listener></lifecycle>


0 0
原创粉丝点击