package com.celnet.datadump.aspect; import com.alibaba.fastjson.JSON; import com.celnet.datadump.annotation.LogServiceAnnotation; import com.celnet.datadump.entity.DataLog; import com.celnet.datadump.service.DataLogService; import com.google.common.collect.Lists; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Date; /** * */ @Aspect @Component @Order(-1) public class OperateLogAspect { private static final Logger log = LoggerFactory.getLogger(OperateLogAspect.class); @Autowired private DataLogService dataLogService; @Pointcut(value = "@annotation(com.celnet.datadump.annotation.LogServiceAnnotation)") public void operateLogAspectPoint(){ } @Around("operateLogAspectPoint()") public Object around(ProceedingJoinPoint joinPoint) { //开始时间 Date startTime = new Date(); //日志注解 LogServiceAnnotation logServiceAnno = null; //request请求 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //捕获请求参数 Object[] args = joinPoint.getArgs(); //结果 Object result = null; try { //获取注解 logServiceAnno = getAnnotationLog(joinPoint); //执行程序 result = joinPoint.proceed(); //初始化日志记录 DataLog dataLog = initializeOperateLog(joinPoint,args,startTime,logServiceAnno,result,null); //保存日志 dataLogService.save(dataLog); } catch (Throwable throwable) { //初始化日志记录 DataLog dataLog = initializeOperateLog(joinPoint,args,startTime,logServiceAnno,null,throwable); //保存日志 dataLogService.save(dataLog); log.error("日志拦截异常:"+throwable); } return result; } /** * 初始化操作日志 * @param joinPoint 节点 */ private DataLog initializeOperateLog(ProceedingJoinPoint joinPoint , Object[] args , Date startTime , LogServiceAnnotation logServiceAnno , Object result , Throwable throwable) { if(logServiceAnno == null){ return null; } //request请求 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //ip String ip = request.getHeader("HTTP_X_FORWARDED_FOR"); //请求参数 Object[] arguments = new Object[args.length]; for (int i = 0; i < args.length; i++) { if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) { //ServletRequest不能序列化,从入参里排除,否则报异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false) //ServletResponse不能序列化 从入参里排除,否则报异常:java.lang.IllegalStateException: getOutputStream() has already been called for this response continue; } arguments[i] = args[i]; } String argStr = arguments.length <= 0 ? "" : JSON.toJSONString(arguments); //响应结果 String resultStr = result == null ? "" : JSON.toJSONString(result); //异常信息 String exceptionStr = throwable == null ? "" : JSON.toJSONString(throwable.getMessage()); //结束时间 Date endTime = new Date(); DataLog dataLog = new DataLog(); dataLog.setIp(ip); dataLog.setStartTime(startTime); dataLog.setEndTime(endTime); if(resultStr.contains("200")){ dataLog.setCode("200"); dataLog.setStatus("成功"); dataLog.setMessage(resultStr); } else { dataLog.setCode("500"); dataLog.setStatus("失败"); dataLog.setMessage(exceptionStr); } dataLog.setRequestUrl(request.getRequestURI()); dataLog.setRequestType(logServiceAnno.operateType()); dataLog.setRequestData(argStr); dataLog.setRequestMethod(logServiceAnno.remark()); return dataLog; } /** * 获取注解 * @param joinPoint 节点 * @return 结果 */ private LogServiceAnnotation getAnnotationLog(ProceedingJoinPoint joinPoint) { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { // 拿到自定义注解中的信息 LogServiceAnnotation annotation = method.getAnnotation(LogServiceAnnotation.class); System.out.println("打印注解信息:"+ JSON.toJSONString(annotation)); return annotation; } return null; } }