首先說明一下,這篇文章只做了記錄日志相關事宜
具體springmvc如何集成配置aop對cotroller進行攔截,請看作者的另一篇文章
http://www.cnblogs.com/guokai870510826/p/5977948.html
好了,回到正題
1、在攔截之前,我們需要額外的自定義一個注解
代碼如下
package com.um.framework.baseware.webadmin.modules.controller.core; import java.lang.annotation.*; @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SystemLog { String module() default ""; String methods() default ""; }
2、aop的實現類中處理記錄日志的邏輯
package com.um.framework.baseware.webadmin.modules.controller.core; import java.lang.reflect.Method; import java.net.InetAddress; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import org.apache.shiro.SecurityUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.um.framework.baseware.common.util.GetLocalIp; import com.um.framework.baseware.webadmin.modules.impl.manager.log.LogServiceImpl; import com.um.framework.baseware.webadmin.modules.services.manager.log.entity.LogEntity; @Aspect public class LogAopAction { //注入service,用來將日志信息保存在數據庫 @Resource(name="logService") private LogServiceImpl logservice; //配置接入點,如果不知道怎么配置,可以百度一下規則 @Pointcut("execution(* com.um.framework.baseware.webadmin.modules.controller..*.*(..))") private void controllerAspect(){}//定義一個切入點 @Around("controllerAspect()") public Object around(ProceedingJoinPoint pjp) throws Throwable { //常見日志實體對象 LogEntity log = new LogEntity(); //獲取登錄用戶賬戶 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String name = (String) request.getSession().getAttribute("USER_ID"); log.setUSERID(name); //獲取系統時間 String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()); log.setDATA(time); //獲取系統ip,這里用的是我自己的工具類,可自行網上查詢獲取ip方法 String ip = GetLocalIp.localIp(); log.setIP(ip); //方法通知前獲取時間,為什么要記錄這個時間呢?當然是用來計算模塊執行時間的 long start = System.currentTimeMillis(); // 攔截的實體類,就是當前正在執行的controller Object target = pjp.getTarget(); // 攔截的方法名稱。當前正在執行的方法 String methodName = pjp.getSignature().getName(); // 攔截的方法參數 Object[] args = pjp.getArgs(); // 攔截的放參數類型 Signature sig = pjp.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("該注解只能用於方法"); } msig = (MethodSignature) sig; Class[] parameterTypes = msig.getMethod().getParameterTypes(); Object object = null; // 獲得被攔截的方法 Method method = null; try { method = target.getClass().getMethod(methodName, parameterTypes); } catch (NoSuchMethodException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SecurityException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (null != method) { // 判斷是否包含自定義的注解,說明一下這里的SystemLog就是我自己自定義的注解 if (method.isAnnotationPresent(SystemLog.class)) { SystemLog systemlog = method.getAnnotation(SystemLog.class); log.setMODULE(systemlog.module()); log.setMETHOD(systemlog.methods()); try { object = pjp.proceed(); long end = System.currentTimeMillis(); //將計算好的時間保存在實體中 log.setRSPONSE_DATA(""+(end-start)); log.setCOMMITE("執行成功!"); //保存進數據庫 logservice.saveLog(log); } catch (Throwable e) { // TODO Auto-generated catch block long end = System.currentTimeMillis(); log.setRSPONSE_DATA(""+(end-start)); log.setCOMMITE("執行失敗"); logservice.saveLog(log); } } else {//沒有包含注解 object = pjp.proceed(); } } else { //不需要攔截直接執行 object = pjp.proceed(); } return object; } }
然后整個業務就處理完了
3、看一下怎么使用
在controller中使用注解
4、日志的實體對象屬性
數據庫表就不用說了吧,和實體字段對應起來就ok了
看一下數據庫表中記錄的數據
至此,aop處理日志就處理完了