package com.cnbm.admin.aspect; import com.cnbm.admin.annotation.LogOperation; import com.cnbm.admin.entity.LoginUser; import com.cnbm.admin.entity.SysLogOperationEntity; import com.cnbm.admin.enums.OperationStatusEnum; import com.cnbm.admin.service.SysLogOperationService; import com.cnbm.common.utils.HttpContextUtils; import com.cnbm.common.utils.IpUtils; import com.cnbm.common.utils.JsonUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** * @Author weihongyang * @Date 2022/6/10 9:41 AM * @Version 1.0 */ @Aspect @Component public class LogOperationAspect { @Autowired private SysLogOperationService sysLogOperationService; @Pointcut("@annotation(com.cnbm.admin.annotation.LogOperation)") public void logPointCut() { } @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); try { //执行方法 Object result = point.proceed(); //执行时长(毫秒) long time = System.currentTimeMillis() - beginTime; //保存日志 saveLog(point, time, OperationStatusEnum.SUCCESS.value()); return result; }catch(Exception e) { //执行时长(毫秒) long time = System.currentTimeMillis() - beginTime; //保存日志 saveLog(point, time, OperationStatusEnum.FAIL.value()); throw e; } } private void saveLog(ProceedingJoinPoint joinPoint, long time, Integer status) throws Exception { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes()); LogOperation annotation = method.getAnnotation(LogOperation.class); SysLogOperationEntity log = new SysLogOperationEntity(); if(annotation != null){ //注解上的描述 log.setOperation(annotation.value()); } //登录用户信息 UsernamePasswordAuthenticationToken authentication = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); if(loginUser != null){ log.setCreatorName(loginUser.getUsername()); } log.setStatus(status); log.setRequestTime((int)time); //请求相关信息 HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); log.setIp(IpUtils.getIpAddr(request)); log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); log.setRequestUri(request.getRequestURI()); log.setRequestMethod(request.getMethod()); //请求参数 Object[] args = joinPoint.getArgs(); try{ String params = JsonUtils.toJsonString(args[0]); log.setRequestParams(params); }catch (Exception e){ } //保存到DB sysLogOperationService.save(log); } }