package com.nanometer.smartlab.listener; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.primefaces.context.RequestContext; import javax.faces.FacesException; import javax.faces.FactoryFinder; import javax.faces.application.ViewHandler; import javax.faces.component.UIViewRoot; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.faces.render.RenderKit; import javax.faces.render.RenderKitFactory; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by johnny on 16/3/14. */ public class MyJsfAjaxTimeoutPhaseListener implements PhaseListener { @Override public void afterPhase(PhaseEvent event) { } @Override public void beforePhase(PhaseEvent event) { FacesContext fc = FacesContext.getCurrentInstance(); RequestContext rc = RequestContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext(); HttpServletResponse response = (HttpServletResponse) ec.getResponse(); HttpServletRequest request = (HttpServletRequest) ec.getRequest(); Subject subject = SecurityUtils.getSubject(); if (!subject.isAuthenticated()) { // considered to be a Timeout case if (ec.isResponseCommitted()) { // redirect is not possible return; } try { if (((rc!=null && RequestContext.getCurrentInstance().isAjaxRequest()) || (fc!=null && fc.getPartialViewContext().isPartialRequest())) && fc.getResponseWriter() == null && fc.getRenderKit() == null) { response.setCharacterEncoding(request.getCharacterEncoding()); RenderKitFactory factory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); RenderKit renderKit = factory.getRenderKit(fc, fc.getApplication().getViewHandler().calculateRenderKitId(fc)); ResponseWriter responseWriter = renderKit.createResponseWriter(response.getWriter(), null, request.getCharacterEncoding()); fc.setResponseWriter(responseWriter); ViewHandler viewHandler = fc.getApplication().getViewHandler(); UIViewRoot viewRoot = viewHandler.createView(fc, "/login.xhtml"); fc.setViewRoot(viewRoot); fc.renderResponse(); // viewHandler.renderView(fc, viewRoot); // fc.responseComplete(); ec.redirect(ec.getRequestContextPath() + "/login.xhtml"); } } catch (IOException e) { throw new FacesException(e); } } else { return ; //This is not a timeout case . Do nothing ! } } @Override public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; } }