公司老大写的aop 拦截后台操作日志
1.自定义注解

import com.redpacket.contract.sys.SysMenu;
import com.redpacket.contract.sys.SysMethod;import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {/*** 模块* @return*/SysMenu menu();/*** 方法* @return*/SysMethod methods() ;/*** 描述* @return*/String description() default "";}

2.相关枚举

public enum SysMenu {SYS_USER("用户管理", "sys_user",SysModule.SYS);/*** 描述*/private final String name;/*** 分类*/private final String type;private final SysModule module;public String getName() {return name;}SysMenu(String name, String type,SysModule module) {this.name = name;this.type = type;this.module =module;}public String getType() {return type;}public SysModule getModule() {return module;}
}
public enum SysMethod {SAVE("添加", "save"),DEL("删除", "del"),UPDATE("更新", "update");/*** 描述*/private final String name;/*** 分类*/private final String type;public String getName() {return name;}SysMethod(String name, String type) {this.name = name;this.type = type;}public String getType() {return type;}
}

3.自定义AOP保存日志

import com.redpacket.common.annotation.SysLog;
import com.redpacket.contract.sys.SysMenu;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.*;@Order(2)
@Aspect
@Component
public class SysLogAop {private static final String MODULE="module";private static final String MENU="menu";private static final String METHODS="methods";private static final String DESCRIPTION="description";private static final String ARGS="args";private Logger logger = LoggerFactory.getLogger(this.getClass());//获取方法参数private LocalVariableTableParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();@Pointcut("@annotation(com.redpacket.common.annotation.SysLog)")public void LogAspect() {}@Around("LogAspect()")public Object doAround(ProceedingJoinPoint point) {RequestAttributes ra = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra = (ServletRequestAttributes) ra;HttpServletRequest request = sra.getRequest();Object result = null;try {result = point.proceed();//具体保存logMap<String, Object> map = this.getMethodDescription(point);//模块名String module = map.get(MODULE).toString();//方法名String methods = map.get(METHODS).toString();//描述String description = map.get(DESCRIPTION).toString();//方法参数String args = map.get(ARGS).toString();} catch (Throwable e) {logger.error("异常信息:{}", e.getMessage());throw new RuntimeException(e);}return result;}@SuppressWarnings("rawtypes")public Map<String, Object> getMethodDescription(JoinPoint joinPoint) throws Exception {Map<String, Object> map = new HashMap<>();//注解所在类名  com.aglaia.core.manager.acl.impl.AdminUserManagerImplString targetName = joinPoint.getTarget().getClass().getName();//注解method   saveString methodName = joinPoint.getSignature().getName();//方法参数Object[] arguments = joinPoint.getArgs();Class<?> targetClass = Class.forName(targetName);//该类下所有方法Method[] methods = targetClass.getMethods();//找到save方法for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {SysMenu sysMenu = method.getAnnotation(SysLog.class).menu();map.put(MODULE, sysMenu.getModule().getType());map.put(MENU, sysMenu.getType());map.put(METHODS, method.getAnnotation(SysLog.class).methods().getType());map.put(ARGS, this.getArgs(method, arguments));String desc = method.getAnnotation(SysLog.class).description();if (StringUtils.isEmpty(desc)) {desc = "执行成功!";}map.put("description", desc);break;}}}return map;}private String getArgs(Method method, Object[] arguments) {StringBuilder builder = new StringBuilder("{");String params[] = parameterNameDiscoverer.getParameterNames(method);for (int i = 0; i < params.length; i++) {if (!StringUtils.equals("password", params[i])) {if (arguments[i].getClass().isArray()) {arguments[i] = Arrays.toString(makeArrayObject(arguments[i]).toArray());}builder.append(params[i]).append(":").append(arguments[i].toString());if (i != params.length - 1) {builder.append("; ");}}}return builder.append("}").toString();}private List<Object> makeArrayObject(Object array) {List<Object> tem = new ArrayList<Object>();for (int i = 0; i < Array.getLength(array); i++) {tem.add(Array.get(array, i));}return tem;}
}

4.注解加入处

    @Override@Transactional@SysLog(menu = SysMenu.SYS_USER,methods = SysMethod.SAVE)public AdminUser save(AdminUser model) {return super.save(model);}

5.重写实体类中toString方法

@Overridepublic String toString() {return toStringHelper().add("username", username).add("phone", phone).add("email", email).add("nickname", nickname).toString();}

aop实现拦截保存操作日志相关推荐

  1. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  2. JPOM - AOP+自定义注解实现操作日志记录

    文章目录 地址 版本 源码解析-AOP+自定义注解实现操作日志记录 地址 Gitee: https://gitee.com/dromara/Jpom 官网: https://jpom.io/ 一款简而 ...

  3. springboot 利用aop实现系统日志和操作日志记录

    1.目的 通过aop及注解的方式,记录异常信息和特定的操作日志到数据库. 2.引入依赖 <dependency><groupId>org.springframework.boo ...

  4. Spring AOP 自定义注解记录操作日志

    1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...

  5. securecrt如何保存操作日志

    转载于:https://www.cnblogs.com/chxmtl/p/7410747.html

  6. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  7. Spring Boot Aop结合Swagger记录用户操作日志

    1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swag ...

  8. SpringBoot AOP 记录操作日志、异常日志

    使用SpringBoot AOP 记录操作日志.异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能.在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因 ...

  9. 【实践】万字干货:如何优雅地记录操作日志?(附代码)

    猜你喜欢 1.如何搭建一套个性化推荐系统? 2.从零开始搭建创业公司后台技术栈 3.某视频APP推荐详解(万字长文) 4.微博推荐算法实践与机器学习平台演进 5.腾讯PCG推荐系统应用实践 6.强化学 ...

最新文章

  1. React 回忆录(三)使用 React 渲染界面
  2. MySQL中优化sql语句查询常用的30种方法
  3. 国网浙江电力组建网络安全分析室
  4. LeetCode_数组_简单题
  5. OpenGL:显示一些立体图形示例程序(真不错)
  6. CVPR2021-RSTNet:自适应Attention的“看图说话”模型
  7. 商汤研究院-SpringAutoML团队招聘啦~
  8. 深度学习8-常用评估函数与自定义评估函数
  9. 20155330 第十一周课堂练习(20170503)
  10. 编程基本功:BUG测试步骤尽可能用文档简化,突出重点
  11. 斐讯k2p openwrt固件改双WAN口
  12. 分布式数据同步工具之DataX Web的基本使用
  13. SpringBoot实现MySQL读写分离
  14. cairosvg在linux中的安装_Cairo编程
  15. Opencv中的convertTo
  16. 使用Navicat将MySql数据库导入和导出
  17. MySQL安装及MySQL8.0新密码认证方式
  18. Spine IK 约束
  19. 曙光服务器I840-G25带外管理
  20. 计算机基础学习日志(二)sq函数

热门文章

  1. Arduino Uno 蜂鸣器播放《天空之城》
  2. java哪座城市好就业_Java开发工程师在哪些城市比较好就业?
  3. MEMS电容式加速度传感器(简介)-传感器专题
  4. PLL 锁相环原理介绍
  5. 迅雷赚钱宝和优酷路由宝赚钱的原理
  6. 校准报告确认有哪些方法?为什么需要进行确认?
  7. CRM客户关系管理系统答辩技术介绍(简答)
  8. 静态时序分析(STA)附秋招面试提问
  9. 最好的3个安卓epub阅读器
  10. blender script mmd_tool 自动重命名刚体到合适的名字