package com.gkhy.exam.framework.aspectj; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.json.JSONObject; import com.alibaba.fastjson2.JSON; import com.gkhy.exam.common.domain.entity.SysUser; import com.gkhy.exam.common.utils.SecurityUtils; import com.gkhy.exam.common.utils.StringUtils; 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.AfterThrowing; 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.core.NamedThreadLocal; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 操作日志记录处理 */ @Aspect @Component @Slf4j public class LogAspect { /** 排除敏感属性字段 */ public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; private static final ThreadLocal TIME_THREADLOCAL=new NamedThreadLocal<>("Cost Time"); @Pointcut("execution(public * com.gkhy.exam.*.controller..*.*(..))") public void logPointCut(){ } /** * 处理完请求后执行 * * @param joinPoint 切点 */ @Around("logPointCut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{ SysUser user= SecurityUtils.getLoginUserWithoutError()!=null?SecurityUtils.getLoginUserWithoutError().getUser():null; long startTime = System.currentTimeMillis(); //获取当前请求对象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); StringBuffer requestURL = request.getRequestURL(); JSONObject webLog = new JSONObject(); String urlStr = request.getRequestURL().toString(); webLog.put("basePath", StringUtils.removeSuffix(urlStr, URLUtil.url(urlStr).getPath())); webLog.put("ip", ServletUtil.getClientIP(request,null)); webLog.put("method",request.getMethod()); Object params=getParameter(method, joinPoint.getArgs()); webLog.put("parameter",params); webLog.put("uri",request.getRequestURI()); webLog.put("url",requestURL.toString()); if(user!=null) { webLog.put("userName", user.getName()); } log.info(webLog.toString()); Object result = joinPoint.proceed(); if (result == null) { //如果切到了 没有返回类型的void方法,这里直接返回 return null; } long endTime = System.currentTimeMillis(); webLog.put("result",StringUtils.sub(JSON.toJSONString(result),0,2000)); webLog.put("spendTime",endTime - startTime); log.info(webLog.toString()); return result; } /** * 拦截异常操作 * @param joinPoint * @param e */ @AfterThrowing(value = "logPointCut()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint,Exception e){ //获取当前请求对象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String urlStr = request.getRequestURL().toString(); log.error("@AfterThrowing异常通知:url={},出错了error_message={}", urlStr,e.getMessage()); } /** * 根据方法和传入的参数获取请求参数 */ private Object getParameter(Method method, Object[] args) { List argList = new ArrayList<>(); Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { //将RequestBody注解修饰的参数作为请求参数 RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class); if (requestBody != null) { argList.add(args[i]); } //将RequestParam注解修饰的参数作为请求参数 RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class); if (requestParam != null) { Map map = new HashMap<>(); String key = parameters[i].getName(); if (StringUtils.isNotEmpty(requestParam.value())) { key = requestParam.value(); } map.put(key, args[i]); argList.add(map); } } if (argList.size() == 0) { return null; } else if (argList.size() == 1) { return argList.get(0); } else { return argList; } } }