jfinal统一的异常及日志处理的拦截器

最近在用轻量级Java web开发框架jfinal开发一个网站,由于网站是sns类型很多ajax交互请求。

考虑简化冗余代码,写了一个统一的异常及日志处理的拦截器。

自适配ajax请求和普通定向请求,输出错误信息。

直接上代码吧

  1. package com.smhaochi.web.interceptor;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6.   
  7. import javax.servlet.http.HttpServletRequest;  
  8.   
  9. import org.apache.commons.lang.StringUtils;  
  10.   
  11. import com.smhaochi.exception.BaseBussException;  
  12. import com.smhaochi.model.ActionLog;  
  13. import com.smhaochi.model.Menu;  
  14. import com.smhaochi.vo.ActionLogVo;  
  15. import com.smhaochi.web.controller.BaseController;  
  16. import com.jfinal.aop.Interceptor;  
  17. import com.jfinal.core.ActionInvocation;  
  18. import com.jfinal.core.JFinal;  
  19. import com.jfinal.log.Logger;  
  20.   
  21. /** 
  22.  * @title: 日志/异常处理拦截器 
  23.  * @className: ActionLogInterceptor 
  24.  * @description: TODO 
  25.  * @company: FOREVEROSS 
  26.  * @author: <a href="http://www.smhaochi.com">vakin jiang</a> 
  27.  * @createDate: 2014年4月2日 
  28.  * @version: 1.0 
  29.  */  
  30. public class ExceptionAndLogInterceptor implements Interceptor {  
  31.   
  32.     private static final Logger log = Logger.getLogger(ExceptionAndLogInterceptor.class);  
  33.     @Override  
  34.     public void intercept(ActionInvocation ai) {  
  35.         BaseController controller = (BaseController)ai.getController();  
  36.         HttpServletRequest request = controller.getRequest();  
  37.           
  38.         boolean successed = false;  
  39.         try {  
  40.             ai.invoke();  
  41.             successed = true;  
  42.         } catch (Exception e) {  
  43.             //  
  44.             doLog(ai,e);  
  45.             //判断是否ajax请求  
  46.             String header = request.getHeader("X-Requested-With");  
  47.             boolean isAjax = "XMLHttpRequest".equalsIgnoreCase(header);  
  48.             String msg = formatException(e);  
  49.             if(isAjax){  
  50.                 msg = new StringBuilder().append("{\"status\":\"0\",\"msg\":\"")  
  51.                         .append(msg).append("\"}").toString();  
  52.                 controller.renderJson(msg);  
  53.             }else{  
  54.                 String redirctUrl = request.getHeader("referer");  
  55.                 if(StringUtils.isBlank(redirctUrl)){  
  56.                     redirctUrl = request.getRequestURI();  
  57.                 }  
  58.                 controller.setAttr("message", msg);  
  59.                 controller.setAttr("redirctUrl",redirctUrl);  
  60.                 controller.render("../public/failed.ftl");  
  61.             }  
  62.         }finally{  
  63.             //记录日志  
  64.             try {  
  65.                 Menu menu = matchDefineRecordLogMenu(request);  
  66.                 if(menu != null){  
  67.                     ActionLogVo actionLog = controller.wrapActionLog();  
  68.                     new ActionLog().set(ActionLog.ACT_NAME, menu.getName())//  
  69.                                    .set(ActionLog.ACT_TIME, new Date())//  
  70.                                    .set(ActionLog.DATA, actionLog.getData())//  
  71.                                    .set(ActionLog.IP, actionLog.getIp())//  
  72.                                    .set(ActionLog.SUCESSED, successed)//  
  73.                                    .set(ActionLog.URI, actionLog.getUri())//  
  74.                                    .set(ActionLog.USER_ID, actionLog.getUserId())//  
  75.                                    .set(ActionLog.USER_NAME, actionLog.getUserName())//  
  76.                                    .save();  
  77.                 }  
  78.             } catch (Exception e2) {}  
  79.               
  80.         }  
  81.     }  
  82.       
  83.     /** 
  84.      * @methodName: matchDefineRecordLogMenu 
  85.      * @description: 匹配已定义需要记录日志的菜单 
  86.      * @author: vakinge 
  87.      * @createDate: 2014年4月3日 
  88.      * @param request 
  89.      * @return  
  90.      */  
  91.     private Menu matchDefineRecordLogMenu(HttpServletRequest request) {  
  92.         Map<String, Menu> menus = Menu.getAllUrlMenus();  
  93.         if(menus != null){  
  94.             String uri = request.getRequestURI();  
  95.             Set<String> urls = menus.keySet();  
  96.             for (String url : urls) {  
  97.                 if(url == null)continue;  
  98.                 //url匹配 && 有参数 && 已配置记录日志  
  99.                 if(url.contains(uri)   
  100.                         && request.getParameterNames().hasMoreElements()  
  101.                         && menus.get(url).isRecordLog()){  
  102.                     return menus.get(url);  
  103.                 }  
  104.             }  
  105.         }  
  106.         return null;  
  107.     }  
  108.   
  109.     /** 
  110.      * @methodName: doLog 
  111.      * @description: 记录log4j日志 
  112.      * @author: vakinge 
  113.      * @createDate: 2014年4月3日 
  114.      * @param ai  
  115.      * @param e  
  116.      */  
  117.     private void doLog(ActionInvocation ai,Exception e) {  
  118.         //开发模式  
  119.         if(JFinal.me().getConstants().getDevMode()){  
  120.             e.printStackTrace();  
  121.         }  
  122.         //业务异常不记录 ??  
  123.         if( e instanceof BaseBussException)return;  
  124.         StringBuilder sb =new StringBuilder("\n---Exception Log Begin---\n");  
  125.         sb.append("Controller:").append(ai.getController().getClass().getName()).append("\n");  
  126.         sb.append("Method:").append(ai.getMethodName()).append("\n");  
  127.         sb.append("Exception Type:").append(e.getClass().getName()).append("\n");  
  128.         sb.append("Exception Details:");  
  129.         log.error(sb.toString(), e);  
  130.     }  
  131.   
  132.     /** 
  133.      * 格式化异常信息,用于友好响应用户 
  134.      * @param e 
  135.      * @return 
  136.      */  
  137.     private static String formatException(Exception e){  
  138.          String message = null;  
  139.             Throwable ourCause = e;  
  140.             while ((ourCause = e.getCause()) != null) {  
  141.                 e = (Exception) ourCause;  
  142.             }  
  143.             String eClassName = e.getClass().getName();  
  144.             //一些常见异常提示  
  145.             if("java.lang.NumberFormatException".equals(eClassName)){  
  146.                 message = "请输入正确的数字";  
  147.             }else if (e instanceof BaseBussException || e instanceof RuntimeException) {  
  148.                 message = e.getMessage();  
  149.                 if(StringUtils.isBlank(message))message = e.toString();  
  150.             }  
  151.               
  152.             //获取默认异常提示  
  153.             if (StringUtils.isBlank(message)){  
  154.                 message = "系统繁忙,请稍后再试";  
  155.             }  
  156.             //替换特殊字符  
  157.             message = message.replaceAll("\"""'");  
  158.             return message;  
  159.     }  
  160.   
  161. }


 


 

你可能感兴趣的:(jfinal统一的异常及日志处理的拦截器)