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;
|
}
|
}
|
}
|