轉載自
https://www.cnblogs.com/guokai870510826/p/5981015.html
直接看代碼
springmvc中的配置aop對 controller和它的子包進行攔截
springmvc中的配置
<!--xml頭部配置需要有這幾行代碼-->
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="logAopAction" class="com.um.framework.baseware.webadmin.modules.controller.core.LogAopAction"/>
<!--aop執行操作的類-->
首先說明一下,這篇文章只做了記錄日誌相關事宜
具體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、看一下怎麼使用
4、日誌的實體對象屬性
數據庫表就不用說了吧,和實體字段對應起來就ok了
看一下數據庫表中記錄的數據