首先說明一下,這篇文章只作了記錄日誌相關事宜html
具體springmvc如何集成配置aop對cotroller進行攔截,請看做者的另外一篇文章java
http://www.cnblogs.com/guokai870510826/p/5977948.htmlweb
好了,回到正題spring
一、在攔截以前,咱們須要額外的自定義一個註解數據庫
代碼以下apache
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 ""; }
二、aop的實現類中處理記錄日誌的邏輯mvc
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; } }
而後整個業務就處理完了工具
三、看一下怎麼使用spa
在controller中使用註解.net
四、日誌的實體對象屬性
數據庫表就不用說了吧,和實體字段對應起來就ok了
看一下數據庫表中記錄的數據
至此,aop處理日誌就處理完了