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