package com.boot.common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.json.JSONObject; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @Aspect @Component @Order(100) public class RestActionInterceptor { private static Log logger = LogFactory.getLog(RestActionInterceptor.class); public RestActionInterceptor() { } @Pointcut("execution(* com.boot.core..*.*(..)) && ( @annotation(org.springframework.web.bind.annotation.RequestMapping) || @annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.PutMapping) || @annotation(org.springframework.web.bind.annotation.DeleteMapping) || @annotation(org.springframework.web.bind.annotation.PatchMapping))") private void anyMethod() { } @Around("anyMethod()") public Object doBasicProfiling(ProceedingJoinPoint joinPoint) throws Throwable { String action = joinPoint.getSignature().toLongString(); Object[] args = joinPoint.getArgs(); StringBuilder argsBuilder = new StringBuilder(); Exception exception = null; StringBuilder logBuilder = new StringBuilder(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String appVersion = request.getHeader("APPVersion"); String deviceModel = request.getHeader("DeviceModel"); String deviceResolution = request.getHeader("DeviceResolution"); String sysVersion = request.getHeader("SysVersion"); String channel = request.getHeader("channel"); String channelNo = request.getHeader("channel_no"); logBuilder.append("--APPVersion:").append(appVersion).append("--DeviceModel:").append(deviceModel).append("--DeviceResolution:").append(deviceResolution).append("--SysVersion:").append(sysVersion).append("--channel:").append(channel).append("--channel_no:").append(channelNo).append("--servletPath:").append(request.getServletPath()).append("--methodInfo:").append(action); long startTime = System.currentTimeMillis(); String retStr; if (args.length > 0) { if (args[0] instanceof Map) { retStr = this.getServletPath(request); Map argsMap = this.skipServletPathKeys(retStr, "faceCheckByDataPackage", (Map) args[0], Arrays.asList("dataPackage")); argsMap = this.skipServletPathKeys(retStr, "faceCheckByDataType", argsMap, Arrays.asList("fileList", "dataPackage", "delta")); argsMap = this.skipServletPathKeys(retStr, "merchFaceCheckByDataType", argsMap, Arrays.asList("fileList", "delta")); argsMap = this.skipServletPathKeys(retStr, "getOCRCertInfo", argsMap, Arrays.asList("data")); argsBuilder.append(new JSONObject(argsMap)); } else { argsBuilder.append(args[0]); } } for (int i = 1; i < args.length; ++i) { argsBuilder.append(", ").append(args[i]); } // 异常的获取可以根据框架中已封装的方法获取 Object result; try { result = joinPoint.proceed(); } catch (Exception var19) { exception = var19; result = var19.getMessage(); } retStr = JSONObject.valueToString(result); logBuilder.append(" args(").append(argsBuilder).append(")").append(" return(").append(retStr).append(")"); if (exception != null) { logBuilder.append(" EXCEPTION:").append("exception.getMessage()").append(" "); } Long timeSpan = System.currentTimeMillis() - startTime; logBuilder.append(" TOOK:").append(timeSpan).append(" ms."); if (exception == null && timeSpan <= 1000L) { this.logger.info(logBuilder.toString()); } else { this.logger.warn(logBuilder.toString()); } return result; } public String getServletPath(HttpServletRequest request) { String[] servletPaths = request.getServletPath().split("/"); return servletPaths[servletPaths.length - 1]; } public Map skipServletPathKeys(String curServletPath, String skipServletPath, Map map, List<String> skipKeys) { if (!StringUtils.isEmpty(skipServletPath) && curServletPath.equals(skipServletPath)) { Map<String, Object> resultMap = new HashMap(); resultMap.putAll(map); resultMap.forEach((key, value) -> { if (skipKeys.contains(key)) { resultMap.put(key, "**"); } }); return resultMap; } else { return map; } } }