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