此工具基于struts2拦截器,其他框架有类似方法的,可以使用同样原理
private static final Logger logger= LoggerFactory.getLogger(ExceptionInterceptor.class);
/**
* 错误返回
*/
private static final String ERROR_RESULT = "error";
/**
* AJAX请求头中带有X-Requested-With: XMLHttpRequest。
*/
private static final String AJAX_HEADER = "X-Requested-With";
private static final String AJAX_HEADER_VALUE = "XMLHttpRequest";
@Override
public String intercept(ActionInvocation invocation) throws Exception {
try {
// 进入下一个拦截器或 Action 操作
return invocation.invoke();
} catch (Throwable e) {
//记录错误日志
logger.error(e.getMessage(),e);
// 系统常规异常
dealWith(invocation, e);
e.printStackTrace();
String ajaxHeadVal = ServletUtils.getRequset().getHeader(AJAX_HEADER);
String pjaxVal = ServletUtils.getRequset().getHeader("X-PJAX");
//对于是ajax请求,但不是pjax请求的,错误时返回错误值,不返回页面
if(StringUtils.isBlank(pjaxVal) && ajaxHeadVal != null && ajaxHeadVal.equalsIgnoreCase(AJAX_HEADER_VALUE)){
RESTResultUtils.response(RESTResultUtils.getError(CodeEnum.SYSTEM_ERROR,e.getMessage()));
return null;
}
}
//正常struts请求,返回错误页面
return ERROR_RESULT;
}
private void dealWith(ActionInvocation invocation, Throwable e) {
ServletUtils.setRequestAttribute("systemError", e.getMessage());
}