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
请求信息,Session
Session信息
* @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