VisitLogInterceptor.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package com.fdkankan.sale.aop;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.extra.servlet.ServletUtil;
  5. import cn.hutool.http.ContentType;
  6. import cn.hutool.http.useragent.UserAgent;
  7. import cn.hutool.http.useragent.UserAgentUtil;
  8. import com.alibaba.fastjson.JSON;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.fdkankan.common.constant.ServerCode;
  11. import com.fdkankan.redis.util.RedisUtil;
  12. import com.fdkankan.sale.entity.SysLog;
  13. import com.fdkankan.sale.entity.SysUser;
  14. import com.fdkankan.sale.service.ISysLogService;
  15. import com.fdkankan.sale.service.ISysUserService;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.aspectj.lang.JoinPoint;
  18. import org.aspectj.lang.ProceedingJoinPoint;
  19. import org.aspectj.lang.annotation.Around;
  20. import org.aspectj.lang.annotation.Aspect;
  21. import org.aspectj.lang.annotation.Pointcut;
  22. import org.aspectj.lang.reflect.MethodSignature;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.stereotype.Component;
  26. import org.springframework.util.ObjectUtils;
  27. import org.springframework.util.StringUtils;
  28. import org.springframework.web.context.request.RequestContextHolder;
  29. import org.springframework.web.context.request.ServletRequestAttributes;
  30. import org.springframework.web.multipart.MultipartFile;
  31. import javax.servlet.http.HttpServletRequest;
  32. import java.util.*;
  33. @Component
  34. @Aspect
  35. @Slf4j
  36. public class VisitLogInterceptor {
  37. @Autowired
  38. ISysLogService sysLogService;
  39. @Value("${server.servlet.context-path:null}")
  40. private String contextPath;
  41. // 切入点表达式
  42. @Pointcut("execution(public * com.fdkankan.sale.controller..*.*(..))")
  43. public void privilege() {
  44. }
  45. @Around("privilege()")
  46. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  47. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  48. //获取客户端ip
  49. String clientIP = ServletUtil.getClientIP(request);
  50. //获取uri
  51. String uri = request.getRequestURI();
  52. if(StrUtil.isNotEmpty(contextPath)){
  53. uri = uri.replaceFirst(contextPath, "");
  54. }
  55. //获取请求方式
  56. String method = request.getMethod();
  57. //获取浏览器信息
  58. String browser = this.getBrowser(request);
  59. //获取操作路径
  60. String requestPath = this.getRequestPath(uri);
  61. //获取参数
  62. String params = this.getParams(pjp, request);
  63. //放行
  64. Object result = pjp.proceed();
  65. String msg = null;
  66. if(!ObjectUtils.isEmpty(result)){
  67. msg = "操作失败";
  68. String resultStr = JSON.toJSONString(result);
  69. JSONObject jsonObject = JSON.parseObject(resultStr);
  70. if(jsonObject.getInteger("code")== null || jsonObject.getInteger("code").equals(ServerCode.SUCCESS.code())){
  71. msg = "操作成功";
  72. }
  73. }
  74. //获取用户信息 如果已登录,从token中获取用户信息,如果是登录接口,查询数据库获取用户信息
  75. Long userId =null;
  76. String userName =null;
  77. String nickName =null;
  78. try {
  79. userId = Long.valueOf(StpUtil.getExtra("userId").toString());
  80. userName = (String)StpUtil.getExtra("userName");
  81. nickName = (String)StpUtil.getExtra("nickName");
  82. }catch (Exception e){
  83. e.printStackTrace();
  84. }
  85. if("GET".equals(method)){
  86. return result;
  87. }
  88. SysLog operLog = new SysLog();
  89. operLog.setUserId(userId);
  90. operLog.setUserName(userName);
  91. operLog.setNickName(nickName);
  92. operLog.setRequestPath(requestPath);
  93. operLog.setUri(uri);
  94. operLog.setMethod(method);
  95. operLog.setParams(params);
  96. operLog.setIp(clientIP);
  97. operLog.setBrowser(browser);
  98. operLog.setResult(msg);
  99. operLog.setOperationType("sale");
  100. sysLogService.save(operLog);
  101. return result;
  102. }
  103. private String getRequestPath(String uri) {
  104. if(uri.contains("/login")){
  105. return "登录";
  106. }
  107. return "";
  108. }
  109. private String getParams(JoinPoint pjp, HttpServletRequest request){
  110. try {
  111. // 获取参数名称
  112. String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
  113. //获取请求参数值
  114. Object[] args = pjp.getArgs();
  115. Map<String, Object> paramMap = new HashMap<>();
  116. String contentType = request.getContentType();
  117. if(StringUtils.isEmpty(contentType)){
  118. return null;
  119. }
  120. if(ContentType.JSON.getValue().equals(contentType)){
  121. String param = args[0] .toString();
  122. return JSON.toJSONString(param);
  123. }else{
  124. for (int i = 0; i < args.length; i++) {
  125. if(args[i] instanceof MultipartFile){
  126. paramMap.put(parameterNamesArgs[i], ((MultipartFile) args[i]).getOriginalFilename());
  127. continue;
  128. }
  129. paramMap.put(parameterNamesArgs[i], args[i]);
  130. }
  131. }
  132. return JSON.toJSONString(paramMap);
  133. }catch (Exception e){
  134. e.printStackTrace();
  135. }
  136. return null;
  137. }
  138. private String getBrowser(HttpServletRequest request){
  139. String userAgentStr = request.getHeader("User-Agent");
  140. UserAgent userAgent = UserAgentUtil.parse(userAgentStr);
  141. String browserType = userAgent.getBrowser().toString();
  142. String browserVersion = userAgent.getVersion();
  143. String browserFormat = "%s(版本%s)";
  144. return String.format(browserFormat, browserType, browserVersion);
  145. }
  146. }