lxw
2023-05-25 f3c27fb78447449a950ba73c5e72ceda64ad8a12
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.whyc.aop;
 
import com.whyc.constant.UserOperation;
import com.whyc.service.OperationLogService;
import com.whyc.util.ActionUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
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 org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
 
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
 
/**
 * 定义aop,对特定的接口进行内容捕捉,生成操作日志
 * 切面为controller
 * 切点为Point表达式
 * 具体连接点为JoinPoint
 * 处理方式为doAfterReturning
 */
 
@Component
@Aspect
public class OperationLogAspect {
 
    @Autowired
    private OperationLogService service;
 
    /**定义切点*/
    @Pointcut(value = "execution(public * com.whyc..controller.*.add*(..))" +
            "|| execution(public * com.whyc..controller.*.delete*(..))" +
            "|| execution(public * com.whyc..controller.*.update*(..))"
    )
    private void operationLogPointcut(){};
 
    /**aop处理类,对捕捉到的切点接口,进行数据处理*/
    @AfterReturning(pointcut = "operationLogPointcut()",returning = "resp")
    public void doAfterReturnOperation(JoinPoint point,Object resp){
        //用户id
        Long uId = ActionUtil.getUser().getUId();
 
        Signature signature = point.getSignature();
        String methodSignature = signature.toString();
        String methodName = signature.getName();
        //执行的类全名
        String fullClassName = signature.getDeclaringTypeName();
 
        Integer operationType = 0;
        String operationTypeName = null;
        String operationTypeNameEn = null;
        if (methodName.contains("update")) {
            //提取单项-修改配置
            if (fullClassName.contains("pageParam")) {
                operationTypeName = UserOperation.TYPE_PARAM_CHANGE.getTypeName();
                operationTypeNameEn = UserOperation.TYPE_PARAM_CHANGE.getTypeNameEn();
                operationType = UserOperation.TYPE_PARAM_CHANGE.getType();
            }
            //提取单项-密码修改
            else if (fullClassName.contains("updatePassword")) {
                operationTypeName = UserOperation.TYPE_PASSWORD_CHANGE.getTypeName();
                operationTypeNameEn = UserOperation.TYPE_PASSWORD_CHANGE.getTypeNameEn();
                operationType = UserOperation.TYPE_PASSWORD_CHANGE.getType();
            } else {
                operationTypeName = UserOperation.TYPE_UPDATE.getTypeName();
                operationTypeNameEn = UserOperation.TYPE_UPDATE.getTypeNameEn();
                operationType = UserOperation.TYPE_UPDATE.getType();
            }
        }else if (methodName.contains("add")){
            operationTypeName = UserOperation.TYPE_ADD.getTypeName();
            operationTypeNameEn = UserOperation.TYPE_ADD.getTypeNameEn();
            operationType = UserOperation.TYPE_ADD.getType();
        }else if (methodName.contains("delete")){
            operationTypeName = UserOperation.TYPE_DELETE.getTypeName();
            operationTypeNameEn = UserOperation.TYPE_DELETE.getTypeNameEn();
            operationType = UserOperation.TYPE_DELETE.getType();
        }/*else if (methodName.contains("login")){
            operationTypeName = UserOperation.TYPE_LOGIN.getTypeName();
            operationType = UserOperation.TYPE_LOGIN.getType();
        }else if (methodName.contains("logout")){
            operationTypeName = UserOperation.TYPE_LOGOUT.getTypeName();
            operationType = UserOperation.TYPE_LOGOUT.getType();
        }*/
 
        //获取类型
        String[] fullClassNameSplit = fullClassName.split("\\.");
        String classNameTrue = fullClassNameSplit[fullClassNameSplit.length - 1];
        String module = "模块";
        String app = "-安卓端";
        String moduleEnus = "module";
        String appEnus = "-android";
        String className = classNameTrue.replace("Controller:", module);
        String classNameEnus = classNameTrue.replace("Controller:", moduleEnus);
        //排除语音触发的日志记录
        if (!classNameTrue.equals("VoiceController")) {
 
            if (fullClassName.contains("app")) {
                className += app;
                classNameEnus += appEnus;
            }
 
            //操作时间
            Date operationTime = new Date();
 
            //客户端ip
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
            String terminalIp = request.getRemoteAddr();
 
            //操作信息
            //获取切点方法信息
            String[] parameterNames = ((MethodSignature) signature).getParameterNames();
            Object[] args = point.getArgs();
 
            HashMap<String, Object> map = new HashMap<>();
            for (int i = 0; i < parameterNames.length; i++) {
                if (args[i] != null) {
                    map.put(parameterNames[i], args[i].toString());
                }
            }
            //人脸接口的添加参数是图片的base64字符串,不存储
            if (methodSignature.contains("FaceController.add") || methodSignature.contains("FaceController.update")) {
                map = new HashMap<>();
            }
            String operationMsg = "执行了" + className + "的" + operationTypeName + "操作.";
            String operationDetail = "具体调用方法为:" + methodName + ",具体参数为:" + map.toString();
            String operationMsgEnUs = "executed:" + classNameEnus + " " + operationTypeNameEn + " operation ";
            String operationDetailEnUs = "Specific calling method is " + methodName + ",Specific parameters are " + map.toString();
 
            service.record(uId, operationType, operationTime, terminalIp, operationMsg, operationDetail, operationMsgEnUs, operationDetailEnUs);
        }
 
    }
 
}