springBoot +AOP+注解记录系统操作日志

缺乏、安全感 2022-10-24 13:11 246阅读 0赞
  1. 创建日志表

CREATE TABLE `dyyy_operation_log` (
`id` bigint NOT NULL COMMENT ‘主键’,
`operation_id` bigint DEFAULT NULL COMMENT ‘操作id’,
`user_id` bigint DEFAULT NULL COMMENT ‘用户id’,
`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘用户名称’,
`module` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘操作模块’,
`method` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘操作方法’,
`ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘操作人客户单ip地址’,
`params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT ‘参数’,
`operation_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘描述’,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT=’操作日志表’;

2.新增日志注解

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface SysLog {
  5. String MODULE() default "操作模块";
  6. String REMARK() default "操作日志";
  7. }

3.新增AOP 切面

  1. @Aspect
  2. @Component
  3. @Slf4j
  4. @Order(1)
  5. public class OperationLogAop {
  6. @Autowired
  7. private OperationLogService operationLogService;
  8. public OperationLogAop() {
  9. log.info("初始化接口日志切面类...");
  10. }
  11. @Pointcut(value = "@annotation(com.dycx.dyyy.web.config.SysLog)")
  12. public void controllerInterceptor() {
  13. }
  14. @Around("controllerInterceptor()")
  15. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
  16. Object result = joinPoint.proceed();
  17. try {
  18. handle(joinPoint);
  19. } catch (Exception e) {
  20. log.error("日志记录出错!", e);
  21. }
  22. return result;
  23. }
  24. private void handle(ProceedingJoinPoint joinPoint) throws Exception {
  25. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  26. Method method = signature.getMethod();
  27. SysLog sysLog = method.getAnnotation(SysLog.class);
  28. OperationLog operationLog = new OperationLog();
  29. if (sysLog != null) {
  30. operationLog.setModule(sysLog.MODULE());
  31. operationLog.setMethod(sysLog.REMARK());
  32. operationLog.setOperationType(sysLog.TYPE());
  33. }
  34. //请求的方法名
  35. String clazzName = joinPoint.getTarget().getClass().getName();
  36. Class<?> clazz = Class.forName(clazzName);
  37. String clazzSimpleName = clazz.getSimpleName();
  38. String methodName = signature.getName();
  39. operationLog.setOperationDesc(clazzSimpleName + "." + methodName);
  40. //请求的参数
  41. String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
  42. StringBuilder sb = null;
  43. if (Objects.nonNull(parameterNames)) {
  44. sb = new StringBuilder();
  45. for (int i = 0; i < parameterNames.length; i++) {
  46. Object param = joinPoint.getArgs()[i] != null ? joinPoint.getArgs()[i] : "";
  47. if (StringUtils.isNotEmpty(param.toString()) && !"request".equals(parameterNames[i]) && !"response".equals(parameterNames[i])
  48. && !"modelMap".equals(parameterNames[i])) {
  49. if (param instanceof Integer) {
  50. sb.append(parameterNames[i] + ":" + param + "; ");
  51. } else if (param instanceof String) {
  52. sb.append(parameterNames[i] + ":" + param + "; ");
  53. } else if (param instanceof Double) {
  54. sb.append(parameterNames[i] + ":" + param + "; ");
  55. } else if (param instanceof Float) {
  56. sb.append(parameterNames[i] + ":" + param + "; ");
  57. } else if (param instanceof Long) {
  58. sb.append(parameterNames[i] + ":" + param + "; ");
  59. } else if (param instanceof Boolean) {
  60. sb.append(parameterNames[i] + ":" + param + "; ");
  61. } else if (param instanceof Date) {
  62. sb.append(parameterNames[i] + ":" + param + "; ");
  63. } else if (param instanceof Timestamp) {
  64. sb.append(parameterNames[i] + ":" + param + "; ");
  65. } else {
  66. sb.append(parameterNames[i] + ":" + getString(param) + "; ");
  67. }
  68. }
  69. }
  70. }
  71. sb = sb == null ? new StringBuilder() : sb;
  72. operationLog.setParams(sb.toString());
  73. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  74. operationLog.setIp(IpUtil.getIpAddr(request));
  75. UserInfo login = (UserInfo) SecurityUtils.getSubject().getPrincipal();
  76. operationLog.setUserName(login.getName());
  77. operationLog.setUserId(login.getId());
  78. operationLog.setCreateTime(LocalDateTime.now());
  79. operationLogService.addOne(operationLog);
  80. }
  81. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNDUwMzUyNg_size_16_color_FFFFFF_t_70

4.添加日志记录

  1. @SysLog(MODULE = "用户模块", REMARK = "查看用户手机号,身份证信息")

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot+AOP实现用户操作记录

    前言: 任何一个项目都会有一个用户操作日志(也叫行为日志)的模块,它主要用来记录某个用户做了某个操作,当出现操作失败时,通过日志就可以快速的查找是哪个用户在哪个模块出现了错