package com.monkeylessey.framework.aspect; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.monkeylessey.annotation.Log; import com.monkeylessey.sys.domain.entity.SysOpLog; import com.monkeylessey.sys.service.SysOpLogService; import com.monkeylessey.framework.utils.SecurityUtil; import lombok.RequiredArgsConstructor; 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.annotation.Pointcut; 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 java.util.Map; /** * @author 29443 * @date 2022/4/19 */ @Aspect @Component @Slf4j @RequiredArgsConstructor public class LogAspect { private final SysOpLogService opLogService; @Pointcut(value = "@annotation(com.monkeylessey.annotation.Log)") public void point() { } /** * @param joinPoint * @param log * @param result * @throws NoSuchMethodException * @annotation(log),处理作用于方法的注解 */ @AfterReturning(pointcut = "@annotation(log)", returning = "result") public void afterReturn(JoinPoint joinPoint, Log log, Object result) throws NoSuchMethodException, JsonProcessingException { handleLog(joinPoint, log, result); } /** * @param joinPoint * @param log * @within(log),处理作用于类的注解 */ @AfterReturning(pointcut = "@within(log)", returning = "result") public void test(JoinPoint joinPoint, Log log, Object result) throws JsonProcessingException { handleLog(joinPoint, log, result); } protected void handleLog(JoinPoint joinPoint, Log log, Object result) throws JsonProcessingException { SysOpLog opLog = new SysOpLog(); String loginName = SecurityUtil.getCurrentUserName(); // 设置请求发起人 opLog.setRequestBy(loginName); // 获取操作名 opLog.setOpName(log.name()); joinPoint.getSignature().getName(); opLog.setInvokeMethod(joinPoint.getSignature().toString()); // 拿到request ServletRequestAttributes requset = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = requset.getRequest(); // 获取请求路径 opLog.setRequestUrl(request.getRequestURI()); // 获取请求方法 opLog.setRequestMethod(request.getMethod()); // 获取请求ip String remoteAddr = request.getRemoteAddr(); opLog.setRequestIp(remoteAddr); // 获取参数 Map parameterMap = request.getParameterMap(); if (!parameterMap.isEmpty()) { opLog.setRequestParam(new ObjectMapper().writeValueAsString(parameterMap)); } // 设置请求结果 opLog.setRequestResult(new ObjectMapper().writeValueAsString(result)); opLogService.save(opLog); } }