IntefaceLogRequiredAOP.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package com.yihu.iot.aop;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.common.collect.Lists;
  5. import com.yihu.iot.service.platform.IotInterfaceLogService;
  6. import com.yihu.iot.service.useragent.UserAgent;
  7. import org.aspectj.lang.ProceedingJoinPoint;
  8. import org.aspectj.lang.annotation.Around;
  9. import org.aspectj.lang.annotation.Aspect;
  10. import org.aspectj.lang.annotation.Pointcut;
  11. import org.aspectj.lang.reflect.MethodSignature;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.context.request.RequestContextHolder;
  17. import org.springframework.web.context.request.ServletRequestAttributes;
  18. import org.springframework.web.multipart.MultipartFile;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.servlet.http.HttpServletResponse;
  21. import java.lang.reflect.Method;
  22. import java.util.Enumeration;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. /**
  27. * 接口调用日志记录
  28. * Created by yeshijie on 2020/06/09.
  29. */
  30. @Aspect
  31. @Component
  32. public class IntefaceLogRequiredAOP {
  33. private Logger logger = LoggerFactory.getLogger(IntefaceLogRequiredAOP.class);
  34. @Autowired
  35. private UserAgent userAgent;
  36. @Autowired
  37. private IotInterfaceLogService iotInterfaceLogService;
  38. //Controller层切点路径
  39. @Pointcut("execution(* com.yihu.iot..*.*(..))")
  40. public void controllerAspect() {
  41. }
  42. public IntefaceLogRequiredAOP() {
  43. //System.out.println("Observer---------------------------------------");
  44. }
  45. @Around("controllerAspect() && @annotation(com.yihu.iot.aop.IntefaceLogRequired)")
  46. public Object addIntefaceLog(ProceedingJoinPoint point) throws Throwable {
  47. Object o = null;
  48. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  49. HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
  50. String error = "";
  51. try {
  52. MethodSignature signature = (MethodSignature) point.getSignature();
  53. Method method = signature.getMethod();
  54. String params = getMethodParams(point);
  55. long start = System.currentTimeMillis();
  56. Object result = point.proceed();
  57. long end = System.currentTimeMillis();
  58. String deleteSensitiveContent = deleteSensitiveContent(result);
  59. JSONObject responseJson = JSONObject.parseObject(deleteSensitiveContent);
  60. Integer state = responseJson.getInteger("status")==200?1:0;
  61. Map<String,String> paramsMap = getMehtodParam(request);
  62. try {
  63. iotInterfaceLogService.saveLog(paramsMap.get("appId"),params,deleteSensitiveContent, request,state,method.getName());
  64. }catch (Exception e){
  65. e.printStackTrace();
  66. }
  67. logger.info("结束请求方法:[{}] 参数:[{}] 返回结果[{}] 耗时:[{}]毫秒 ",
  68. method.getName(), params, deleteSensitiveContent, end - start);
  69. return result;
  70. }catch (Exception e){
  71. e.printStackTrace();
  72. //return o;
  73. }
  74. o = point.proceed();
  75. return o;
  76. }
  77. private String getMethodName(ProceedingJoinPoint joinPoint) {
  78. String methodName = joinPoint.getSignature().toShortString();
  79. String shortMethodNameSuffix = "(..)";
  80. if (methodName.endsWith(shortMethodNameSuffix)) {
  81. methodName = methodName.substring(0, methodName.length() - shortMethodNameSuffix.length());
  82. }
  83. return methodName;
  84. }
  85. private Map<String,String> getMehtodParam(HttpServletRequest request){
  86. Map<String,String> params = new HashMap<String,String>();
  87. Enumeration<String> e = request.getParameterNames();
  88. while(e.hasMoreElements()){
  89. String p = e.nextElement();
  90. if("logData".equals(p)){
  91. continue;
  92. }
  93. if("base64".equals(p)){
  94. continue;
  95. }
  96. params.put(p, request.getParameter(p));
  97. }
  98. return params;
  99. }
  100. private String getMethodParams(ProceedingJoinPoint joinPoint){
  101. Object[] arguments = joinPoint.getArgs();
  102. StringBuilder sb = new StringBuilder();
  103. if(arguments ==null || arguments.length <= 0){
  104. return sb.toString();
  105. }
  106. for (Object arg : arguments) {
  107. //移除敏感内容
  108. String paramStr;
  109. if (arg instanceof HttpServletResponse) {
  110. paramStr = HttpServletResponse.class.getSimpleName();
  111. } else if (arg instanceof HttpServletRequest) {
  112. paramStr = HttpServletRequest.class.getSimpleName();
  113. } else if (arg instanceof MultipartFile) {
  114. long size = ((MultipartFile) arg).getSize();
  115. paramStr = MultipartFile.class.getSimpleName() + " size:" + size;
  116. } else {
  117. paramStr = deleteSensitiveContent(arg);
  118. }
  119. sb.append(paramStr).append(",");
  120. }
  121. return sb.deleteCharAt(sb.length() - 1).toString();
  122. }
  123. /**
  124. * 删除参数中的敏感内容
  125. * @param obj 参数对象
  126. * @return 去除敏感内容后的参数对象
  127. */
  128. public static String deleteSensitiveContent(Object obj) {
  129. JSONObject jsonObject = new JSONObject();
  130. if (obj == null || obj instanceof Exception) {
  131. return jsonObject.toJSONString();
  132. }
  133. String param = JSON.toJSONString(obj);
  134. try {
  135. jsonObject = JSONObject.parseObject(param);
  136. }catch (Exception e) {
  137. return String.valueOf(obj);
  138. }
  139. List<String> sensitiveFieldList = getSensitiveFieldList();
  140. for (String sensitiveField : sensitiveFieldList) {
  141. if (jsonObject.containsKey(sensitiveField)) {
  142. jsonObject.put(sensitiveField, "******");
  143. }
  144. }
  145. return jsonObject.toJSONString();
  146. }
  147. /**
  148. * 敏感字段列表(当然这里你可以更改为可配置的)
  149. */
  150. private static List<String> getSensitiveFieldList() {
  151. List<String> sensitiveFieldList = Lists.newArrayList();
  152. sensitiveFieldList.add("pwd");
  153. sensitiveFieldList.add("password");
  154. return sensitiveFieldList;
  155. }
  156. }