郑永安
2023-09-19 69185134fcfaf913ea45f1255677225a2cc311a4
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
package com.gk.hotwork.Config.Log;
 
 
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.gk.hotwork.Config.Oauth2.IRedisService;
import com.gk.hotwork.Config.Oauth2.RedisKeyEnum;
import com.gk.hotwork.Domain.Enum.SourceType;
import com.gk.hotwork.Domain.HiddenDanger;
import com.gk.hotwork.Domain.HiddenDangerLog;
import com.gk.hotwork.Domain.Log.HiddenDangerLogAnno;
import com.gk.hotwork.Domain.UserInfo;
import com.gk.hotwork.Domain.Utils.CommonUtil;
import com.gk.hotwork.Domain.Utils.Msg;
import com.gk.hotwork.Domain.Utils.SpringBeanUtil;
import com.gk.hotwork.Service.HiddenDangerLogService;
import com.gk.hotwork.Service.UserService;
import com.google.common.net.HttpHeaders;
import io.jsonwebtoken.Claims;
import org.apache.log4j.Logger;
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.Before;
import org.aspectj.lang.annotation.Pointcut;
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 javax.xml.crypto.Data;
import java.lang.reflect.Method;
import java.util.Date;
 
@Aspect
@Component
public class HiddenDangerLogAspect {
 
    private static final Logger logger = Logger.getLogger(HiddenDangerLogAspect.class);
 
    @Autowired
    private HiddenDangerLogService hiddenDangerLogService;
    @Autowired
    private IRedisService redisService;
    @Autowired
    private UserService userService;
 
    @Pointcut("@annotation(com.gk.hotwork.Domain.Log.HiddenDangerLogAnno)")
    public void controllerAspect() {
    }
 
 
    @AfterReturning(returning="result",pointcut = "controllerAspect()")
    public void AfterExec(JoinPoint joinPoint,Object result)
    {
        handleLog(joinPoint,result);
    //调用日志处理类去处理我们的日志
    }
 
 
    private void handleLog(JoinPoint joinPoint,Object result) {
        try {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            assert requestAttributes != null;
            HttpServletRequest request = requestAttributes.getRequest();
            String token = request.getHeader(HttpHeaders.AUTHORIZATION);
            //解析token
            Claims claims = CommonUtil.parseJWT(token);
            String tokenKey = StrUtil.format(RedisKeyEnum.AUTH_TOKEN.getKey(), claims.getId());
            Object o = redisService.get(tokenKey);
            JSONObject user = JSONObject.parseObject(o.toString());
            Msg msg = (Msg) result;
            Object hiddenDanger = msg.getResult();
            HiddenDangerLog logInfo = getLogInfo(joinPoint);
            if (logInfo != null) {
                Long id = user.getLong("id");
                UserInfo userInfo = userService.getById(id);
                logInfo.setOperatorid(id);
                logInfo.setOperator(userInfo.getRealname());
                logInfo.setDetail(logInfo.getOperator() + logInfo.getDetail());
                logInfo.setOperationtime(new Date());
                logInfo.setValidflag(true);
                logInfo.setExtra(hiddenDanger instanceof HiddenDanger?((HiddenDanger) hiddenDanger).getRectifier():"");
                hiddenDangerLogService.save(logInfo);
            }
 
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
 
 
    private HiddenDangerLog getLogInfo(JoinPoint joinPoint) throws Exception{
        //类名
        String targetName = joinPoint.getTarget().getClass().getName();
        //
        String methodName = joinPoint.getSignature().getName();
        HiddenDangerLog hiddenDangerLog = null;
        Object[] args = joinPoint.getArgs();
        Class<?> targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class<?>[] clazzs = method.getParameterTypes();
                if (clazzs.length == args.length) {
                    hiddenDangerLog = new HiddenDangerLog();
                    String detail = method.getAnnotation(HiddenDangerLogAnno.class).detail();
                    String operation = method.getAnnotation(HiddenDangerLogAnno.class).operation();
                    SourceType source = method.getAnnotation(HiddenDangerLogAnno.class).source();
                    hiddenDangerLog.setDetail(detail);
                    hiddenDangerLog.setOperation(operation);
                    hiddenDangerLog.setSource(source);
                    break;
                }
            }
        }
        return hiddenDangerLog;
    }
 
}