1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<br>package com.sleep.demo.intercepter;
 
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
@Slf4j
@Aspect
@Component
public class ControllerLogAspect {
    @Pointcut("execution(* com.sleep.demo.controller..*.*(..))")
    public void pointCut() {
    }
 
 
    @Around(value = "pointCut()")
    public Object doAuthMethodInterrupt(ProceedingJoinPoint point) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String methodName = point.getSignature().getName();
 
        // 入参
        Object[] paramArr = point.getArgs();
 
        //序列化时过滤掉request和response
        List<Object> logArgs = streamOf(paramArr)
                .filter(arg -> (!(arg instanceof HttpServletRequest)
                        && !(arg instanceof HttpServletResponse
                )))
                .collect(Collectors.toList());
 
        // 入参打印
        log.info(">>>>>>>>>>>>  Method:{} , path={} ,Param:{}"
                , methodName, request.getRequestURI(), JSONObject.toJSONString(logArgs));
        try {
            long currentTimeStampBegin = System.currentTimeMillis();
            Object obj = point.proceed();
            long diff = System.currentTimeMillis() - currentTimeStampBegin;
            // 出参打印
            log.info("<<<<<<<<<<<< method:{} , Response:{} ,time:{}ms", methodName, JSONObject.toJSONString(obj), diff);
            return obj;
        } catch (Throwable e) {
            log.error("<<<<<<<<<<<< method:{},REQUEST_ERROR_MSG:{}", methodName, e.getMessage());
//      throw new RuntimeException(e);
            e.printStackTrace();
            return 500;
 
        }
    }
 
    public static <T> Stream<T> streamOf(T[] array) {
        return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.stream(array);
    }
 
}

需要有spring aop的支持

1
2
3
4
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 

 

 

其他例子,aop获取方法入参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.jd.rcloud.decorate.aop;
 
import com.jd.rcloud.common.util.JsonUtils;
import com.jd.rcloud.decorate.login.base.service.LoginContextService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import com.jd.am.util.UtilString;
import com.jd.rcloud.common.ann.ReqParamAssembler;
import com.jd.rcloud.decorate.util.AdminRequestContextHelper;
import com.jd.rcloud.decorate.admin.domain.param.req.AdminBaseReqParam;
 
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
 
import java.lang.reflect.Method;
 
/**
 * 控制层层主切面类
 *
 * @author lidalin7
 *
 */
@Slf4j
@Setter
@Getter
@Aspect
@Component
public class AdminControllerAop {
 
    @Autowired
    private LoginContextService loginContextService;
 
    @Pointcut("execution(* com.jd.rcloud.decorate.*.web..*Controller.*(..))")
    public static void doPointcut() {
        System.out.println("这个方法不会被执行,它只是负责描述切入点");
    }
 
    @Before("doPointcut() && @annotation(reqParamAssembler)")
    public void doBefore(JoinPoint joinPoint, ReqParamAssembler reqParamAssembler) {
 
        // 开始执行所有请求的DoBefore
        if (joinPoint == null) {
            return;
        }
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        if (methodSignature == null) {
            return;
        }
 
        Method method = methodSignature.getMethod();
        if (method == null) {
            return;
        }
 
        // 参数集合
        Object[] objs = joinPoint.getArgs();
 
        for (Object obj : objs) {
 
            // 若非商家端基础请求参数的实例->继续
            if (obj instanceof AdminBaseReqParam) {
 
                AdminBaseReqParam adminBaseReqParam = (AdminBaseReqParam) obj;
 
                // 优先接受前端的入参,
 
                if (UtilString.isBlank(adminBaseReqParam.getTenantCode())) {
                    adminBaseReqParam.setTenantCode(AdminRequestContextHelper.getTenantCode());// 租户编码
                }
 
                if (adminBaseReqParam.getBusinessType() == null) {
                    adminBaseReqParam.setBusinessType(AdminRequestContextHelper.getBusinessType());// 租户编码
                }
 
                if (adminBaseReqParam.getSystemType() == null) {
                    adminBaseReqParam.setSystemType(AdminRequestContextHelper.getSystemType());// 租户编码
                }
 
                adminBaseReqParam.setUserPin(this.loginContextService.getPin());// 用户Pin
                adminBaseReqParam.setCreator(this.loginContextService.getPin());// 创建者
                adminBaseReqParam.setOperator(this.loginContextService.getPin());// 操作者
 
            }
 
            if(log.isInfoEnabled()){
                log.info("[{}][部分设置]设置请求参数的核心属性为:", method.getName(), obj.toString());
            }
        }
    }
}