前言

实际业务,有时候需要记录服务的操作日志,我们可以利用SpringAOP 切面来拦截记录用户操作;用户使用session或者前端传值都可以。

1.创建日志记录接口

首先我们得有一个接口,这个接口可以记录用户访问服务器的方法
例:

//合并
import java.lang.annotation.*;@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface MyLog {String value() default "";
}

2.使用接口

注解使用

注:你想捕获那个方法用户操作,就给那个方法加注解,不需要的忽略

    @GetMapping("/deleteServiceByServNo")@MyLog(value = "删除服务")public ReturnMsg deleteServiceByServNo(@RequestParam("servNo")String servNo){interfaceConfigurationService.deleteServiceByServNo(servNo);return new ReturnMsg("200","success");}

3.配置切面类 通知

 package com.df.security.config;
//合并
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.commons.lang3.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import com.alibaba.fastjson.JSON;
import com.df.bean.SysLog;
import com.df.bean.User;
import com.df.service.IpUtil;
import com.df.service.SysLogService;
import java.util.stream.*;@Aspect
@Component
public class SysLogAspect {@Autowiredprivate SysLogService sysLogService;@Pointcut("@annotation(MyLog)")public void logPoinCut() {}//切面 配置通知@AfterReturning("logPoinCut()")public void saveSysLog(JoinPoint joinPoint) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();SysLog sysLog = new SysLog();//从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取切入点所在的方法Method method = signature.getMethod();System.out.println("获取的方法有:"+method);//获取操作MyLog myLog = method.getAnnotation(MyLog.class);if (myLog != null) {String value = myLog.value();sysLog.setOperation(value);//保存获取的操作System.out.println("操作方法名:"+value);}//获取请求的类名String className = joinPoint.getTarget().getClass().getName();//获取请求的方法名String methodName = method.getName();sysLog.setMethod(className + "." + methodName);System.out.println("获取请求的方法名有:"+methodName);//请求的参数Object[] args = joinPoint.getArgs();//过滤HttpServletRequest和HttpServletResponse类型的参数List<Object> logArgs = streamOf(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))).collect(Collectors.toList());String argStr = JSON.toJSONString(logArgs);//将参数所在的数组转换成json//String params = JSON.toJSONString(args);//sysLog.setParams(params);sysLog.setParams(argStr);//获取操作用户HttpServletRequest request = requestAttributes.getRequest();/*HttpSession session = request.getSession();User user=(User) session.getAttribute("user");sysLog.setUserName(user.getUserName());*//*HttpSession session = request.getSession();String userName= (String) session.getAttribute("userName");sysLog.setUserName(userName);*/String userName = request.getHeader("userName");if(userName == null || "".equals(userName)){sysLog.setUserName("dsgc");}else{sysLog.setUserName(userName);}//sysLog.setUserName("admin");User user = (User)request.getSession().getAttribute("user");System.out.println("***操作用戶為***:"+user);if(user!=null){sysLog.setUserName(user.getUserName());}//获取日期SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String creationDate=df.format(new Date());sysLog.setOpertionDate(creationDate);//获取ipString ip=IpUtil.getIpAddr(request);sysLog.setIp(ip);//插入本地捕获用户操作日志sysLogService.insertSysLog(sysLog);}/* public static void main(String[] args){SysLogAspect sysLogAspect = new SysLogAspect();//sysLogAspect.saveSysLog();}*/public static <T> Stream<T> streamOf(T[] array) {return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.asList(array).stream();}}

4.效果图


祝你幸福
送你一首歌:《还有我》 任贤齐
附图:解放J7

Spring AOP 切面记录操作日志相关推荐

  1. spring aop 实现系统操作日志记录存储到数据库

    1.引入依赖 <!--spring切面aop依赖--> <dependency><groupId>org.springframework.boot</grou ...

  2. springmvc 切面记录操作日志

    <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy proxy-target-class="true" /> ...

  3. java AOP实现记录操作日志

    最近做项目需要添加一个用户操作记录功能,需要记录用户操作调用了哪些接口,通过获取swagger注解上的接口说明,然后存到数据库,也可以不落库打印日志记录. 数据库: CREATE TABLE `job ...

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

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

  5. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录

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

  6. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  7. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

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

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

  9. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

最新文章

  1. php json_encode 后直接复制给js怎么调用,如何将数组从php(使用json_encode)传递给javascript...
  2. react 倒计时 countDown
  3. linux 将远程mysql复制,在线备份MySQL及远程copy到远程备份服务器shell脚本
  4. 安卓php推送消息机制,深入剖析Android消息机制原理
  5. Webstorm设置开发模板
  6. 综合日语第一册第十四课
  7. SQL Server触发器创建、删除、修改、查看示例步骤
  8. 使用CAJViewer 提取PDF文件中的文字
  9. 微软VMM2008实战之P2V迁移攻略
  10. slub分配流程-kmem_cache_alloc函数
  11. 电脑连接ios开发配置
  12. 农村三资管理平台app_中科农村三资管理软件系统免费版
  13. POJ 2387 Til the Cows Come Home BFS最短路求解
  14. python求不规则图形面积_使用Python生成不规则形状的图形
  15. 工作日志-上班头一天
  16. 免费PBootCMS采集支持聚合文章采集插件
  17. Java中resualtset,Java SafeEncoder類代碼示例
  18. LMS学习管理系统综述
  19. NBA表格_NBA球星大排位16—季后赛荣誉汇总
  20. 最新尚硅谷Java MyBatisPlus教程(完整)

热门文章

  1. 百度地图调用电子围栏API实现案例
  2. ZYNQ中裸机开发和Linux开发有什么区别?
  3. 2013年H1B携H4签证
  4. 人脸识别用哪种python库_GitHub - Veechiry/face_collection: python的face_recognition人脸识别库的使用...
  5. Java--Integer的常量缓存池(默认-128~127数值范围)
  6. 大众点评分布式系统监控开源框架cat源码阅读(个人笔记)
  7. mes java_MES项目简单总结(技术篇)
  8. shell删除指定时间之前的文件
  9. 曹则贤:量子力学从来不是什么革命,而是经典物理学的自然延续
  10. NEIL: Extracting Visual Knowledge from Web Data