LogAopHandler.java 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.iamberry.rst.controllers.log;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.iamberry.rst.core.sys.Admin;
  4. import com.iamberry.rst.core.sys.SystemLogs;
  5. import com.iamberry.rst.faces.sys.SysService;
  6. import com.iamberry.rst.utils.AdminUtils;
  7. import org.apache.shiro.authz.annotation.RequiresPermissions;
  8. import org.aspectj.lang.ProceedingJoinPoint;
  9. import org.aspectj.lang.annotation.Around;
  10. import org.aspectj.lang.annotation.Aspect;
  11. import org.aspectj.lang.annotation.Pointcut;
  12. import org.aspectj.lang.reflect.MethodSignature;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.web.context.request.RequestAttributes;
  16. import org.springframework.web.context.request.RequestContextHolder;
  17. import org.springframework.web.context.request.ServletRequestAttributes;
  18. import javax.servlet.http.HttpServletRequest;
  19. import java.util.Arrays;
  20. import java.util.Enumeration;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. /**
  24. * 统一日志处理
  25. * @author 献
  26. */
  27. public class LogAopHandler {
  28. @Autowired
  29. private SysService sysService;
  30. /**
  31. * controller层面记录操作日志
  32. * 注意此处是aop:around的 因为需要得到请求前的参数以及请求后接口返回的结果
  33. * @throws Throwable
  34. */
  35. public Object doSaveLog(ProceedingJoinPoint joinPoint) throws Throwable {
  36. // 获取Reqest
  37. RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
  38. if (requestAttributes == null) {
  39. return joinPoint.proceed(joinPoint.getArgs());
  40. }
  41. // 获取请求方法
  42. MethodSignature method = (MethodSignature) joinPoint.getSignature();
  43. // 此处不能用getAnnotationByType 是JAVA8的特性,因为注解能够重名,所以得到的是数组
  44. RequiresPermissions annotation = method.getMethod().getAnnotation(RequiresPermissions.class);
  45. if (annotation == null) {
  46. return joinPoint.proceed(joinPoint.getArgs());
  47. }
  48. /* 只是记录经过拦截的日志 */
  49. HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
  50. // 请求参数实例化为JSON格式的字符串
  51. Enumeration<String> params = request.getParameterNames();
  52. Map<String, Object> paramMap = new HashMap<>();
  53. while (params.hasMoreElements()) {
  54. // 获取请求参数以及对应的值,防止多个值的问题
  55. String param = params.nextElement();
  56. String[] values = request.getParameterValues(param);
  57. if (values == null) {
  58. continue;
  59. }
  60. if (values.length == 1) {
  61. paramMap.put(param, values[0]);
  62. } else {
  63. paramMap.put(param, values);
  64. }
  65. }
  66. // 请求参数
  67. String requestJSON = JSONObject.toJSONString(paramMap);
  68. // 操作用户id
  69. Integer adminId = AdminUtils.getLoginAdminId();
  70. Admin temp = new Admin();
  71. temp.setAdminId(adminId);
  72. temp = sysService.getAdminInfo(temp);
  73. // 操作权限
  74. String symbol = annotation.value()[0];
  75. String symbolName = sysService.getSymbolName(symbol);
  76. // 描述 【XX】在【什么时候】操作了【什么】
  77. String details = "【" + temp.getAdminName() + "】操作【" + symbolName + "】";
  78. SystemLogs logs = new SystemLogs();
  79. logs.setAdminId(adminId);
  80. logs.setLogsSymbol(symbol);
  81. logs.setLogsDetails(details);
  82. logs.setLogsRequest(requestJSON);
  83. sysService.addLogs(logs);
  84. // 注意around的情况下需要返回result 否则将不会返回值给请求者
  85. return joinPoint.proceed(joinPoint.getArgs());
  86. }
  87. }