LogAspect.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.cyksj.aspect;
  2. import com.cyksj.web.util.StpAbroadUtil;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.servlet.ServletUtil;
  6. import com.cyksj.common.annotation.Log;
  7. import com.cyksj.common.util.Jsons;
  8. import com.cyksj.common.util.StringUtil;
  9. import com.cyksj.enums.BusinessStatus;
  10. import com.cyksj.mapper.manage.cms.SysLogMapper;
  11. import com.cyksj.model.entity.CmsUser;
  12. import com.cyksj.model.entity.SysLog;
  13. import com.cyksj.service.mange.cms.CmsUserManager;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.aspectj.lang.JoinPoint;
  17. import org.aspectj.lang.annotation.AfterReturning;
  18. import org.aspectj.lang.annotation.AfterThrowing;
  19. import org.aspectj.lang.annotation.Aspect;
  20. import org.springframework.http.HttpMethod;
  21. import org.springframework.stereotype.Component;
  22. import org.springframework.validation.BindingResult;
  23. import org.springframework.web.multipart.MultipartFile;
  24. import org.springframework.web.servlet.HandlerMapping;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import java.util.Collection;
  28. import java.util.Enumeration;
  29. import java.util.Map;
  30. /*
  31. *项目名: yicang-admin
  32. *文件名: LogAspect
  33. *创建者: JavaZou
  34. *创建时间:2022/9/30 10:55
  35. */
  36. @Aspect
  37. @Component
  38. @Slf4j
  39. @RequiredArgsConstructor
  40. public class LogAspect {
  41. private final HttpServletRequest request;
  42. private final CmsUserManager cmsUserManager;
  43. private final SysLogMapper sysLogManager;
  44. /**
  45. * 处理后完成
  46. * 切入点
  47. */
  48. @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
  49. public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {
  50. handleLog(joinPoint, controllerLog, null, jsonResult);
  51. }
  52. /**
  53. * 异常处理
  54. * 切入
  55. */
  56. @AfterThrowing(pointcut = "@annotation(controllerLog)", throwing = "e")
  57. public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
  58. handleLog(joinPoint, controllerLog, e, null);
  59. }
  60. private void handleLog(JoinPoint joinPoint, Log controllerLog, Exception e, Object jsonResult) {
  61. try {
  62. // 获取当前的用户
  63. CmsUser cmsUser = cmsUserManager.getUser(StpAbroadUtil.getLoginIdAsLong());
  64. SysLog sysLog = new SysLog();
  65. sysLog.setOperateIp(ServletUtil.getClientIP(request));
  66. sysLog.setOperateUrl(request.getRequestURI());
  67. sysLog.setStatus(BusinessStatus.SUCCESS.ordinal());
  68. sysLog.setOperateTime(DateTime.now().toString());
  69. //操作人
  70. if (cmsUser != null) {
  71. sysLog.setOperator(cmsUser.getNickname());
  72. sysLog.setAccount(cmsUser.getPhone());
  73. }
  74. if (e != null) {
  75. sysLog.setStatus(BusinessStatus.FAIL.ordinal());
  76. sysLog.setErrMsg(StrUtil.subSufByLength(e.getMessage(), 2000));
  77. }
  78. // 设置方法名称
  79. String className = joinPoint.getTarget().getClass().getName();
  80. String methodName = joinPoint.getSignature().getName();
  81. sysLog.setMethod(String.format("%s.%s", className, methodName));
  82. // 处理设置注解上的参数
  83. getControllerMethodDescription(joinPoint, controllerLog, sysLog, jsonResult);
  84. //请求方式
  85. sysLog.setRequestMethod(request.getMethod());
  86. sysLog.setOperateLocation(StringUtil.getRealAddressByIP(sysLog.getOperateIp()));
  87. sysLogManager.insert(sysLog);
  88. } catch (Exception exp) {
  89. // 记录本地异常日志
  90. log.error("==前置通知异常==");
  91. log.error("异常信息:{}", exp.getMessage());
  92. }
  93. }
  94. private void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysLog sysLog, Object jsonResult) throws Exception {
  95. sysLog.setModule(log.module());
  96. sysLog.setBusinessType(log.businessType().ordinal());
  97. // 是否需要保存request,参数和值
  98. if (log.isSaveRequestData()) {
  99. // 获取参数的信息,传入到数据库中。
  100. setRequestValue(joinPoint, sysLog, log);
  101. }
  102. // 是否需要保存response,参数和值
  103. if (log.isSaveResponseData() && jsonResult != null) {
  104. sysLog.setJsonResult(StrUtil.subSufByLength(Jsons.toJson(jsonResult), 2000));
  105. }
  106. }
  107. /**
  108. * 请求入参
  109. */
  110. private void setRequestValue(JoinPoint joinPoint, SysLog sysLog, Log log) throws Exception {
  111. String requestMethod = log.businessType().name();
  112. if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
  113. String params = argsArrayToString(joinPoint.getArgs());
  114. sysLog.setOperateParams(StrUtil.subSufByLength(params, 2000));
  115. } else {
  116. Map<Object, Object> paramsMap = (Map<Object, Object>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
  117. if (paramsMap.size() == 0) {
  118. Enumeration<String> parameterNames = request.getParameterNames();
  119. while (parameterNames.hasMoreElements()) {
  120. String key = parameterNames.nextElement();
  121. String value = request.getParameter(key);
  122. paramsMap.put(key, value);
  123. }
  124. }
  125. sysLog.setOperateParams(StrUtil.subSufByLength(paramsMap.toString(), 2000));
  126. }
  127. }
  128. /**
  129. * 参数拼装
  130. */
  131. private String argsArrayToString(Object[] paramsArray) {
  132. String params = "";
  133. if (paramsArray != null && paramsArray.length > 0) {
  134. for (Object o : paramsArray) {
  135. if (o != null && !isFilterObject(o)) {
  136. try {
  137. Object jsonObj = Jsons.toJson(o);
  138. params += jsonObj.toString() + " ";
  139. } catch (Exception e) {
  140. }
  141. }
  142. }
  143. }
  144. return params.trim();
  145. }
  146. /**
  147. * 判断是否需要过滤的对象。
  148. *
  149. * @param o 对象信息。
  150. * @return 如果是需要过滤的对象,则返回true;否则返回false。
  151. */
  152. @SuppressWarnings("rawtypes")
  153. public boolean isFilterObject(final Object o) {
  154. Class<?> clazz = o.getClass();
  155. if (clazz.isArray()) {
  156. return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
  157. } else if (Collection.class.isAssignableFrom(clazz)) {
  158. Collection collection = (Collection) o;
  159. for (Object value : collection) {
  160. return value instanceof MultipartFile;
  161. }
  162. } else if (Map.class.isAssignableFrom(clazz)) {
  163. Map map = (Map) o;
  164. for (Object value : map.entrySet()) {
  165. Map.Entry entry = (Map.Entry) value;
  166. return entry.getValue() instanceof MultipartFile;
  167. }
  168. }
  169. return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
  170. || o instanceof BindingResult;
  171. }
  172. }