package com.gkhy.assess.framework.aop; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.json.JSONObject; import com.gkhy.assess.common.utils.StringUtils; import com.gkhy.assess.system.utils.ShiroUtils; 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.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 { @Pointcut("execution(public * com.gkhy.assess.*.controller..*.*(..))") public void logPointCut(){ } /** * 处理完请求后执行 * * @param joinPoint 切点 */ @Around("logPointCut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{ 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()); String userId=ShiroUtils.getUserId()!=null?String.valueOf(ShiroUtils.getUserId()):""; webLog.put("userId",userId); log.info(webLog.toString()); Object result = joinPoint.proceed(); if (result == null) { //如果切到了 没有返回类型的void方法,这里直接返回 return null; } long endTime = System.currentTimeMillis(); webLog.put("result",result); 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; } } }