package com.nanometer.smartlab.exception; import com.nanometer.smartlab.util.FacesUtils; import org.apache.log4j.Logger; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.ExpiredSessionException; import javax.faces.FacesException; import javax.faces.application.NavigationHandler; import javax.faces.application.ViewExpiredException; import javax.faces.context.ExceptionHandler; import javax.faces.context.ExceptionHandlerWrapper; import javax.faces.context.FacesContext; import javax.faces.event.ExceptionQueuedEvent; import javax.faces.event.ExceptionQueuedEventContext; import java.util.Iterator; /** * when view expired, invole js function "whenExpired()", popup a dialog to notice user * * Created by johnny on 14-3-15. */ public class MyExceptionHandler extends ExceptionHandlerWrapper { private static Logger logger = Logger.getLogger(MyExceptionHandler.class); private ExceptionHandler wrapped; public MyExceptionHandler(ExceptionHandler wrapped) { this.wrapped = wrapped; } @Override public ExceptionHandler getWrapped() { return this.wrapped; } @Override public void handle() throws FacesException { Iterable events = this.wrapped.getUnhandledExceptionQueuedEvents(); for (Iterator it = events.iterator(); it.hasNext(); ) { ExceptionQueuedEvent event = it.next(); ExceptionQueuedEventContext eqec = event.getContext(); Throwable throwable = eqec.getException(); try { if (throwable != null) if (throwable instanceof ViewExpiredException || throwable instanceof ExpiredSessionException) { FacesContext context = eqec.getContext(); NavigationHandler navHandler = context.getApplication().getNavigationHandler(); SecurityUtils.getSubject().logout(); FacesUtils.js("whenExpired()"); } else { FacesUtils.error("系统错误"); logger.error("Error: ", throwable); } } finally { it.remove(); } } this.wrapped.handle(); } }