工具类RequestLogAspect
package com.fxkj.manager.aspect;
import com.fxkj.common.dto.OperParamDTO;
import com.fxkj.common.dto.SystemUserDTO;
import com.fxkj.common.mapper.SysOperRecordMapper;
import com.fxkj.common.model.SysOperRecord;
import com.fxkj.common.security.TokenUserAutoConfiguration;
import com.fxkj.common.util.IDGenerator;
import com.fxkj.common.util.IPUtils;
import com.fxkj.common.util.JsonUtils;
import eu.bitwalker.useragentutils.UserAgent;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
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 org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Component
@Aspect
@Slf4j
public class RequestLogAspect {
@Autowired
private SysOperRecordMapper sysOperRecordMapper;
@Autowired
private TokenUserAutoConfiguration tokenUserAutoConfiguration;
//com.fxkj.manager.web下的所有接口 && 不是com.fxkj.manager.web.wx下的接口:完成后插入操作记录
@Pointcut("execution(* com.fxkj.manager.web..*(..)) && !execution(* com.fxkj.manager.web.wx..*(..))")
public void requestServer() {
}
@Before("requestServer()")
public void doBefore(JoinPoint joinPoint) {
log.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(),
joinPoint.getSignature().getName());
}
@Around("requestServer()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
ApiOperation annotation = methodSignature.getMethod().getAnnotation(ApiOperation.class);
long start = System.currentTimeMillis();
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
OperParamDTO requestParams = getRequestParams(proceedingJoinPoint);
SystemUserDTO systemUserDTO = tokenUserAutoConfiguration.systemUser(request);
if(systemUserDTO !=null){
requestParams.setUserId(systemUserDTO.getUserId());
requestParams.setUserName(systemUserDTO.getUsername());
}
String value = annotation ==null ? "":annotation.value();
/*============根据自己业务需求插入操作记录============*/
SysOperRecord sysOperRecord = SysOperRecord.builder()
.id(IDGenerator.generateUUID())
.userId(getRequestParams(proceedingJoinPoint).getUserId())
.userName(getRequestParams(proceedingJoinPoint).getUserName())
.operContent(value + ":" + requestParams.getParams() + "")
.operType(request.getMethod())
.createTime(LocalDateTime.now())
.build();
sysOperRecordMapper.insert(sysOperRecord);
return proceedingJoinPoint.proceed();
}
@After("requestServer()")
public void doAfter(JoinPoint joinPoint) {
log.info("===============================End========================");
}
/**
* 获取入参
* @param proceedingJoinPoint
* @return
* */
private OperParamDTO getRequestParams(ProceedingJoinPoint proceedingJoinPoint) {
Map<String, Object> requestParams = new HashMap<>();
OperParamDTO operParamDTO = new OperParamDTO();
//参数名
String[] paramNames =
((MethodSignature)proceedingJoinPoint.getSignature()).getParameterNames();
//参数值
Object[] paramValues = proceedingJoinPoint.getArgs();
for (int i = 0; i < paramNames.length; i++) {
Object value = paramValues[i];
//如果是文件对象
if (value instanceof MultipartFile) {
MultipartFile file = (MultipartFile) value;
value = file.getOriginalFilename(); //获取文件名
}
if(! (value instanceof SystemUserDTO)){
requestParams.put(paramNames[i], value);
}
}
operParamDTO.setParams(requestParams);
return operParamDTO;
}
}