推荐一个开源免费java分布式开发框架: http://www.jeesuite.com/
最近在用轻量级Java web开发框架jfinal开发一个网站,由于网站是sns类型很多ajax交互请求。
考虑简化冗余代码,写了一个统一的异常及日志处理的拦截器。
自适配ajax请求和普通定向请求,输出错误信息。
直接上代码吧
package com.smhaochi.web.interceptor; import java.util.Date; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import com.smhaochi.exception.BaseBussException; import com.smhaochi.model.ActionLog; import com.smhaochi.model.Menu; import com.smhaochi.vo.ActionLogVo; import com.smhaochi.web.controller.BaseController; import com.jfinal.aop.Interceptor; import com.jfinal.core.ActionInvocation; import com.jfinal.core.JFinal; import com.jfinal.log.Logger; /** * @title: 日志/异常处理拦截器 * @className: ActionLogInterceptor * @description: TODO * @company: FOREVEROSS * @author: <a href="http://www.smhaochi.com">vakin jiang</a> * @createDate: 2014年4月2日 * @version: 1.0 */ public class ExceptionAndLogInterceptor implements Interceptor { private static final Logger log = Logger.getLogger(ExceptionAndLogInterceptor.class); @Override public void intercept(ActionInvocation ai) { BaseController controller = (BaseController)ai.getController(); HttpServletRequest request = controller.getRequest(); boolean successed = false; try { ai.invoke(); successed = true; } catch (Exception e) { // doLog(ai,e); //判断是否ajax请求 String header = request.getHeader("X-Requested-With"); boolean isAjax = "XMLHttpRequest".equalsIgnoreCase(header); String msg = formatException(e); if(isAjax){ msg = new StringBuilder().append("{\"status\":\"0\",\"msg\":\"") .append(msg).append("\"}").toString(); controller.renderJson(msg); }else{ String redirctUrl = request.getHeader("referer"); if(StringUtils.isBlank(redirctUrl)){ redirctUrl = request.getRequestURI(); } controller.setAttr("message", msg); controller.setAttr("redirctUrl",redirctUrl); controller.render("../public/failed.ftl"); } }finally{ //记录日志 try { Menu menu = matchDefineRecordLogMenu(request); if(menu != null){ ActionLogVo actionLog = controller.wrapActionLog(); new ActionLog().set(ActionLog.ACT_NAME, menu.getName())// .set(ActionLog.ACT_TIME, new Date())// .set(ActionLog.DATA, actionLog.getData())// .set(ActionLog.IP, actionLog.getIp())// .set(ActionLog.SUCESSED, successed)// .set(ActionLog.URI, actionLog.getUri())// .set(ActionLog.USER_ID, actionLog.getUserId())// .set(ActionLog.USER_NAME, actionLog.getUserName())// .save(); } } catch (Exception e2) {} } } /** * @methodName: matchDefineRecordLogMenu * @description: 匹配已定义需要记录日志的菜单 * @author: vakinge * @createDate: 2014年4月3日 * @param request * @return */ private Menu matchDefineRecordLogMenu(HttpServletRequest request) { Map<String, Menu> menus = Menu.getAllUrlMenus(); if(menus != null){ String uri = request.getRequestURI(); Set<String> urls = menus.keySet(); for (String url : urls) { if(url == null)continue; //url匹配 && 有参数 && 已配置记录日志 if(url.contains(uri) && request.getParameterNames().hasMoreElements() && menus.get(url).isRecordLog()){ return menus.get(url); } } } return null; } /** * @methodName: doLog * @description: 记录log4j日志 * @author: vakinge * @createDate: 2014年4月3日 * @param ai * @param e */ private void doLog(ActionInvocation ai,Exception e) { //开发模式 if(JFinal.me().getConstants().getDevMode()){ e.printStackTrace(); } //业务异常不记录 ?? if( e instanceof BaseBussException)return; StringBuilder sb =new StringBuilder("\n---Exception Log Begin---\n"); sb.append("Controller:").append(ai.getController().getClass().getName()).append("\n"); sb.append("Method:").append(ai.getMethodName()).append("\n"); sb.append("Exception Type:").append(e.getClass().getName()).append("\n"); sb.append("Exception Details:"); log.error(sb.toString(), e); } /** * 格式化异常信息,用于友好响应用户 * @param e * @return */ private static String formatException(Exception e){ String message = null; Throwable ourCause = e; while ((ourCause = e.getCause()) != null) { e = (Exception) ourCause; } String eClassName = e.getClass().getName(); //一些常见异常提示 if("java.lang.NumberFormatException".equals(eClassName)){ message = "请输入正确的数字"; }else if (e instanceof BaseBussException || e instanceof RuntimeException) { message = e.getMessage(); if(StringUtils.isBlank(message))message = e.toString(); } //获取默认异常提示 if (StringUtils.isBlank(message)){ message = "系统繁忙,请稍后再试"; } //替换特殊字符 message = message.replaceAll("\"", "'"); return message; } }
相关推荐
jfinal中拦截器(Interceptor)的参数注入jfinal中拦截器(Interceptor)的参数注入
在Jfinal中,拦截器是实现AOP(面向切面编程)的一种方式,可以对Controller的处理方法进行预处理和后处理。 1. **创建拦截器** 在Jfinal项目中,我们首先需要创建一个实现了`Interceptor`接口的类,例如`...
为了达到这个目的,可以在拦截器中捕获并处理异常,或者在控制器中定义一个统一的错误处理方法。 5. **优化与扩展**:除了基本的登录验证,拦截器还可以进一步扩展,比如加入记住我功能的处理、登录超时的判断等。...
JFinal 是一个基于 Java 的轻量级 Web 开发框架,它提供了拦截器(Interceptor)功能,允许开发者在请求处理前、处理后进行额外的操作,例如权限验证、日志记录等。下面将详细介绍 JFinal 拦截器的配置和使用方法。 ...
拦截器(Interceptor)是jFinal框架中的一个重要机制,它允许我们在请求处理前进行预处理,或者在处理后进行后续操作,而无需修改具体控制器的代码。本篇将详细讲解如何利用jFinal的拦截器实现登录验证。 1. **...
本文将深入探讨如何在JFinal项目中进行日志配置,并结合Oracle数据库进行简单实现。 首先,让我们来了解JFinal的日志配置。JFinal默认集成了Log4j作为日志系统,但同时也支持其他日志框架如Logback和Java内置的日志...
3. **控制器(Controller)**:在`src/main/java`中,会有对应的Controller类,这些类继承自JFinal的`Controller`基类,负责处理HTTP请求,并调用相应的业务逻辑。 4. **模型(Model)**:这部分代码通常处理数据的...
在 JFinal 中,我们可以定义拦截器来实现如权限检查、日志记录等功能,提高代码复用性和可维护性。 4. `Plugin`:JFinal 插件机制允许开发者扩展框架功能,如 ORM 插件、缓存插件等。这些插件可以方便地集成到项目...
jfinal做web开发使用,数据库表建好后,可生成表对应的Model,Service,Controller,sql模板等以及web应用相关的一些文件或者在数据库修改后一键同步model.附件中是jar包和一份使用实例代码.
4. **拦截器**:通过自定义拦截器,开发者可以实现如权限控制、日志记录等功能,提高代码的复用性。 5. **内置组件**:JFinal 内置了 Session、Cookie、UploadFile 等常用组件,使得开发者无需额外引入第三方库即可...
EhCache是JFinal支持的缓存插件之一,本章节介绍了EhCachePlugin的基本概念、配置以及相关的拦截器。此外,还讲解了CacheKit工具的使用和ehcache.xml的配置。 第八章 RedisPlugin Redis作为内存存储系统,被广泛...
10. **异常处理**:Jfinal 提供了统一的异常处理机制,可以通过自定义异常处理器,统一处理运行时异常,提高用户体验。 11. **Web 组件**:Jfinal 内置了对 Session、Cookie、Request、Response 等 HTTP 相关对象的...
JFinal的AOP部分主要讲述了如何使用拦截器来增强代码的可维护性和扩展性。这部分介绍了Interceptor接口以及各种拦截器的触发机制。 #### 特殊拦截器 文档还介绍了Duang、Enhancer等特殊拦截器,以及如何在不同级别...
Jfinal的核心组件包括:Controller、Model、View和Interceptor(拦截器),它们共同构成了一个完整的Web应用程序。Jfinal还支持多种数据库,如MySQL、Oracle等,并且提供了ActiveRecord模式,使得数据库操作更加便捷...
5. 异常处理:增强了异常处理机制,提供统一的错误页面和异常处理策略,提升了用户体验。 三、JFinal 主要组件详解 1. Controller:负责接收 HTTP 请求,处理业务逻辑,并返回视图或 JSON 数据。 2. Model:与...
- 自定义异常处理机制,允许开发者统一处理异常情况,提高用户体验。 10. **依赖注入**: - 虽然 JFinal 并未内置完整的依赖注入框架,但可以通过简单的配置实现类似功能,如手动注入或使用第三方库。 通过对 ...
1. **拦截器(Interceptor)**:JFinal的拦截器允许在请求处理前后插入自定义逻辑,实现权限控制、日志记录等功能。 2. **插件(Plugin)**:JFinal提供了丰富的插件支持,如ActiveRecord、Shiro安全框架、Quartz定时...
首先是拦截器的调用,拦截器调用中会重新回调ActionInvocation的invoke,当拦截器调用完毕后,会调用当前操作的method 6. 当进入具体Controller的新增方法时,调用基类getModel(Systemparam.class);这个方法会从...
3. **AOP 支持**:JFinal 提供了拦截器(Interceptor)机制,实现面向切面编程,可以方便地进行日志记录、权限控制等操作。 4. **插件化**:JFinal 的插件系统使得开发者可以轻松地扩展框架功能,如 SQL 执行插件、...
拦截器是`JFinal`中的一个高级特性,它可以对请求进行预处理和后处理,例如权限验证、日志记录等。在`Jfdemo`中,可能包含了一些示例拦截器,展示了如何注册和使用拦截器。 7. **实际代码与注释** 文件`jfdemo`...