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

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>


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值