package com.emato.ccnet.wx.aop; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Collection; import java.util.Map; /** * 日志AOP * 通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等 * 通过RequestContextHolder来获取HttpServletRequest请求信息,SessionSession信息 * @author Scott Chen * @since 1.0 * 2015-05-13 */ @Aspect public class AspectWebLog { private static final Logger logger = LoggerFactory.getLogger(AspectWebLog.class); @Autowired ObjectMapper objectMapper; @Pointcut("execution(* com.emato.ccnet.wx..*.*(..)) " + "&& @annotation(org.springframework.web.bind.annotation.RequestMapping)" + "&& !execution(* com.emato.ccnet.wx..aop..*.*(..))") public void controllerPointcut(){} /** * 前置通知 * 执行方法之前执行前置通知方法 * @param jp:JoinPoint * @return */ @Before(value="controllerPointcut()") public void beforeAdvice(JoinPoint jp) { // 目标方法的参数信息 Object[] args = jp.getArgs(); // AOP代理类的信息 Object objThis = jp.getThis(); // 代理的目标对象 Object objTarget = jp.getTarget(); // 通知的方法签名 Signature signature = jp.getSignature(); // AOP代理类类型 Class proxyClzz = signature.getDeclaringType(); // AOP代理类名 String className = signature.getDeclaringTypeName(); // 代理方法名 String methodName = signature.getName(); // 获取RequestAttributes ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = attributes.getRequest(); //method logger.debug("--- 请求Method: {}", request.getMethod()); //类方法 logger.debug("--- 调用class: 【{}】, method: 【{}】", className, methodName); try { String str = null; if (args.length > 0) { if (args[0] instanceof Collection || args[0] instanceof Map) { str = objectMapper.writeValueAsString(args[0]); } else { for(int i=0;i 0) { if (args[0] instanceof Collection || args[0] instanceof Map) { str = objectMapper.writeValueAsString(args[0]); } else { for(int i=0;i