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