刘小明
2024-11-25 327309dfb97043b54a4f6f8c8ebb3191987f67fa
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
141
142
143
144
145
146
package com.dy.pmsGlobal.aop;
 
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.webFilter.UserTokenContext;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pmsGlobal.pojoBa.BaUser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.UriComponentsBuilder;
 
@Slf4j
@Aspect
@Component
public class LogAspect {
 
    @Value("${pms.sso.curUserUrl}")
    public String SsoCurUserUrl ;
 
    private LogService logSv;
    @Value("${pms.global.dev}")
    public String isDevStage ;//是否为开发阶段
    @Autowired
    public void setLogSv(LogService logSv){
        this.logSv = logSv;
    }
    private RestTemplate restTemplate;
    @Autowired
    public void setRestTemplate(RestTemplate restTemplate){
        this.restTemplate = restTemplate ;
    }
 
    @AfterReturning(pointcut = "@annotation(com.dy.pmsGlobal.aop.Log)", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, BaseResponse result) {
        if(isDevStage != null && !isDevStage.trim().equals("") && isDevStage.trim().equalsIgnoreCase("true")){
            return;
        }
        try{
            // 获取用户信息
            BaUser user = (BaUser)getCurUser(result);
            if(user!=null && user.id !=null && !StringUtils.isNullOrEmpty(user.name)){
                // 获取方法的中文描述
                MethodSignature sign = (MethodSignature) joinPoint.getSignature();
                Log logDesc = sign.getMethod().getAnnotation(Log.class);
                String operationName = logDesc.value();
                // 获取IP地址
                String ip = getRemoteHost();
                // 记录日志
                //msg  方法名 + 参数值 + 返回值
//                Stream.of(joinPoint.getArgs()).forEach(System.out::println);
//                String args = JSONObject.toJSONString(joinPoint.getArgs());
                //String args1 = Arrays.toString(joinPoint.getArgs());
                logSv.save(user.id,user.name, operationName,ip,result.getCode(),result.getMsg());
            }
        }catch (Exception e){
            log.error("记录日志异常:"+e.getMessage());
        }
    }
 
    /**
     * 调用SSO获取用户信息
     * @param response (获取token)
     * @return 返回对象
     */
    private Object getCurUser(BaseResponse response){
        if(!StringUtils.isNullOrEmpty(SsoCurUserUrl)){
            String token = UserTokenContext.get();
            if(StringUtils.isNullOrEmpty(token)){
                JSONObject res = objectToJson(response.getContent());
                if(res!=null && res.containsKey("token")){
                    token = res.get("token").toString();
                }
            }
 
            String url = UriComponentsBuilder.fromUriString(SsoCurUserUrl)
                    .queryParam("token", token)
                    .build()
                    .toUriString();
            HttpHeaders headers = new HttpHeaders();
            HttpEntity<?> httpEntity = new HttpEntity<>(headers);
            ResponseEntity<BaUser> myResponse = null;
            try {
                // 通过Get方式调用接口
                myResponse = restTemplate.exchange(url, HttpMethod.GET, httpEntity, BaUser.class);
            } catch (Exception e) {
                e.printStackTrace();
            }
            assert myResponse != null;
            return myResponse.getBody();
        }else {
            return BaseResponseUtils.buildError("后端系统出错,未得到SsoCurUserUrl");
        }
    }
 
    /**
     * 获取IP地址
     * @return
     */
    private String getRemoteHost() {
        // 获取请求对象
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
 
    /**
     * 将对象转换为JSONObject
     * @param obj
     * @return
     */
    public static JSONObject objectToJson(Object obj) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            JSONObject o = JSONObject.parseObject(mapper.writeValueAsString(obj));
            return o;
        } catch (Exception e) {
            log.error("对象转换为JSONObject失败:"+e.getMessage());
            return null;
        }
    }
}