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<ExceptionQueuedEvent> events = this.wrapped.getUnhandledExceptionQueuedEvents();
|
for (Iterator<ExceptionQueuedEvent> 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();
|
}
|
}
|