package com.java214.aop; import java.lang.reflect.Method; import java.util.Date; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.java214.annotation.SystemLog; import com.java214.model.Log; import com.java214.service.LogService; import com.java214.util.UserIpUtil; @Aspect @Component public class SystemLogAspect { // 注入Service用于把日志保存数据库 @Resource private LogService logService; // Service层切点 @Pointcut("@annotation(com.java214.annotation.SystemLog)") public void serviceAspect() { } @After("serviceAspect()") public void doServiceLog(JoinPoint joinPoint) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); try { // 数据库日志 Log log = new Log(); // 获取日志描述信息 log.setUserType(getUserType(joinPoint)); log.setIp(UserIpUtil.getIp(request)); log.setParam(joinPoint.getArgs()[0].toString()); log.setDescription(getDescription(joinPoint)); log.setAddtime(new Date()); if(!log.getParam().equals("none")){ logService.insert(log); } } catch (Exception e) { } } /** * 获取注解中对方法的描述信息 用于service层注解 * * @param joinPoint * 切点 * @return 方法描述 * @throws Exception */ public static String getDescription(JoinPoint joinPoint) throws Exception { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class<?> targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); String description = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { description = method.getAnnotation(SystemLog.class) .description(); break; } } } return description; } /** * 获取注解中的用户信息 用于service层注解 * * @param joinPoint * 切点 * @return 方法描述 * @throws Exception */ public static String getUserType(JoinPoint joinPoint) throws Exception { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class<?> targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); String userType = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { userType = method.getAnnotation(SystemLog.class) .userType(); break; } } } return userType; } }
