700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Spring Boot AOP记录用户操作日志

Spring Boot AOP记录用户操作日志

时间:2018-10-14 23:23:13

相关推荐

Spring Boot AOP记录用户操作日志

一、引入必要依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!-- druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

二、自定义注解

定义一个方法级别的@Log注解,用于标注需要监控的方法:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Log {String value() default "";}

三、建立数据表和实体类

数据表:

实体类:

@Data@TableName("sys_handle_log")public class SysHandleLog extends Model<SysHandleLog> {@TableId(value = "id", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "执行人")@TableField("create_user")private String createUser;@ApiModelProperty(value = "操作")@TableField("operation")private String operation;@ApiModelProperty(value = "执行的方法")@TableField("method")private String method;@ApiModelProperty(value = "携带参数")@TableField("params")private String params;@ApiModelProperty(value = "耗时")@TableField("spend_time")private Integer spendTime;@ApiModelProperty(value = "用户ip")@TableField("ip")private String ip;@ApiModelProperty(value = "位置")@TableField("location")private String location;@ApiModelProperty(value = "创建时间")@TableField("create_time")private Date createTime;@Overrideprotected Serializable pkVal() {return this.id;}}

四、日志切面

@Aspect@Componentpublic class UserOperateAspect{@Autowiredprivate SysHandleLogMapper sysHandleLogMapper;@Pointcut("@annotation(mon.annotation.UserOperateLog)")public void pointcut() {}@Around("pointcut()")public Object around(ProceedingJoinPoint point) {Object result = null;long beginTime = System.currentTimeMillis();try {// 执行方法result = point.proceed();} catch (Throwable e) {e.printStackTrace();}// 执行时长(毫秒)long time = System.currentTimeMillis() - beginTime;// 保存日志saveLog(point, time);return result;}private void saveLog(ProceedingJoinPoint joinPoint, long time) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();SysHandleLog sysHandleLog = new SysHandleLog();UserOperateLog logAnnotation = method.getAnnotation(UserOperateLog.class);if (logAnnotation != null) {// 执行的操作sysHandleLog.setOperation(logAnnotation.value());}// 请求的方法名String className = joinPoint.getTarget().getClass().getName();String methodName = signature.getName();sysHandleLog.setMethod(className + "." + methodName + "()");// 请求的方法参数值Object[] args = joinPoint.getArgs();// 请求的方法参数名称LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();String[] paramNames = u.getParameterNames(method);if (args != null && paramNames != null) {String params = "";for (int i = 0; i < args.length; i++) {if(args[i] instanceof Project) {Class<?> object = args[i].getClass();//获取实体类的所有属性,返回Field数组Field[] fields = object.getDeclaredFields();for (Field field : fields) {//field.toString() 格式:private java.lang.String com.project.sys.entity.Project.projectProperty 只需要projectPropertytry {field.setAccessible(true);if (field.get(args[i]) != null && !"".equals(field.get(args[i]))) {params += " " + StringUtils.substringAfterLast(field.toString(), ".") + ": " + field.get(args[i]);}} catch (IllegalAccessException e) {e.printStackTrace();}}}else if(args[i]!=null&&!args[i].equals("")){params += " " + paramNames[i] + ": " + args[i];}}sysHandleLog.setParams(params);}// 获取requestHttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 获取ip及地址String IP=IPUtils.getIpAddress(request);sysHandleLog.setIp(IP);sysHandleLog.setLocation(AddressUtils.getAddressByIP(IP).replaceAll("\\d+","").replace("|",""));//获取用户名SysUserInfo userInfo= (SysUserInfo) request.getSession().getAttribute(SystemConst.SYSTEM_USER_SESSION);sysHandleLog.setCreateUser(userInfo.getName());sysHandleLog.setSpendTime((int) time);sysHandleLog.setCreateTime(new Date());// 保存系统日志sysHandleLogMapper.insert(sysHandleLog);}}

五、控制器

@Controller@RequestMapping("sys-handlelog-info/")public class SysHandleLogController {@Autowiredprivate SysHandleLogService sysHandleLogService;@AutowiredSysHandleLogMapper sysHandleLogMapper;@GetMapping("init")public String init() {return "sys/handlelog/list";}@PostMapping("list")@ResponseBodypublic LayTableResult list(Integer page, Integer limit, SysHandleLog sysHandleLog) {return sysHandleLogService.list(page, limit, sysHandleLog);}@GetMapping("deleteAll")public String deleteAll() {sysHandleLogMapper.deleteHandleLog();return "sys/handlelog/list";}}

注:部分dao层代码没给出,这里主要给出思路

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。