当前位置: 首页 > news >正文

springboot使用aop切面,记录日志

技术说明:

springboot:2.1.4.RELEASE
jQuery
Ajax
mysql:8.0.32

业务背景:

当我们在操作网页的时候,我们后台需要记录每个用户,什么时候操作了哪些记录。比如注册了,还是登录了,还是查询了,我们把这些记录全部储存起来,方便管理员查看。

pom.xml

        <!--日志记录--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.25.1</version></dependency>
        <!--aop切面,方便记录日志--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

首先定义一个AopContextUtil工具类,里面包含一些常用方法,比如记录用户访问的ip

public class AopContextUtil {/*** 入参数据* @param joinPoint* @param request* @return*/public static String preHandle(JoinPoint joinPoint, HttpServletRequest request) {String reqParam = "";Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method targetMethod = methodSignature.getMethod();Annotation[] annotations = targetMethod.getAnnotations();for (Annotation annotation : annotations) {//此处可以改成自定义的注解if (annotation.annotationType().equals(RequestMapping.class)) {reqParam = JSON.toJSONString(request.getParameterMap());break;}}return reqParam;}/*** 获取IP地址的方法** @param request 传一个request对象下来* @return*/public static String getIpAddress(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;}
}

定义切面类,就是哪些类哪些方法,需要被记录

@Aspect
@Component
@Slf4j
public class CommonAspect {@Autowiredprivate LogsService logsService;//这是一个日志service层,用来插入到日志数据表里面/***  定义切点 @Pointcut*/@Pointcut("execution(* com.yuanshengrong.springbootyuanshengrong.controller.*.*(..))")//这里定义的是在这个目录下的controller包下的所有类,所有方法都被记录,就是当用户触发了这个类,这个方法,那就记录下来,用户发起了什么请求。public void log(){}/*** ProceedingJoinPoint仅支持@Around*/@AfterReturning("log()")public void saveOperation(JoinPoint joinPoint){log.info("---------------接口日志记录---------------");// 创建一个日志对象(准备记录日志)LogsDo logsDo = new LogsDo();HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();//IP地址String ipAddr = AopContextUtil.getIpAddress(request);//AopContextUtil前面有定义,获取ip的logsDo.setClientip(ipAddr);//urlString url = request.getRequestURL().toString();//用户发起的请求链接logsDo.setOperurl(url);//请求参数/* String reqParam =AopContextUtil.preHandle(joinPoint,request);logsDo.setReqparam(reqParam);*/// 1.方法执行前的处理,相当于前置通知// 获取方法签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取切入点所在的方法Method method = signature.getMethod();// 获取方法上面的注解LogAnno logAnno = method.getAnnotation(LogAnno.class);if (logAnno !=null){// 获取操作描述的属性值String operateType = logAnno.operateType();// 保存操作说明logsDo.setOpertype(operateType);}//TODO 设置操作人,从session中获取。String username = (String)request.getSession().getAttribute("username");//从session中获取用户名,记录是哪个用户操作的//保存用户名到数据库logsDo.setUsername(username);// 设置操作日期logsDo.setOpertime(new Date());logsService.insertSelective(logsDo);}
}
@Target(ElementType.METHOD) // 方法注解
@Retention(RetentionPolicy.RUNTIME) // 运行时可见
public @interface LogAnno {String operateType();// 记录日志的操作类型
}

上面这个代码,是用来记录日志的,我们只需要在方法上加上@LogAnno(operateType = "导出面试信息Excel记录"),用来记录操作的日志类型即可

http://www.hskmm.com/?act=detail&tid=34964

相关文章:

  • 【整活】OI的那些奇妙小操作(Part 1)
  • 想学习的数学
  • qzmoot 生活合集
  • OO之接口-DAO模式代码阅读及应用
  • 个微协议,微信号二次开发/ipad协议
  • Win11设置默认打开全部右键菜单
  • 发现概率
  • 微信机器人开发API!3步搞定微信聊天机器人
  • yocto工程升级要点
  • windows2019的域控服务器更新时间.251020
  • 国内DOH解析速度测试(阿里 腾讯 360 Doh测速)
  • WatchAlert 轻量级AI日志告警 - Docker安装部署
  • 对话智能体泛化研究在线挑战启动
  • 2025.10.20
  • 利用Python写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
  • sp681网卡打驱动后的状态--默认是链路是down
  • dlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)
  • 软件研发项目管理提效方案|流程驱动 数据赋能:打造上下游信息透明的研发项目管理新模式
  • 2025年10月深度seek排名优化服务排行榜:十大服务商综合对比与选择指南
  • NetSuite-WMS瀚钰通仓库对接使用说明
  • 2025年10月deepseek排名优化服务推荐排行榜:十家服务商综合评测与选择指南
  • 案例分析:MySQL 并行复制竟然比单线程慢?
  • 第二周记
  • 克服keepalived的主备服务器都持有VIP——出现脑裂现象
  • 2025年10月深度关键词排名优化服务推荐排行榜:十大服务商综合对比与评测分析
  • Codeforces Round 1060 (Div. 2) A - C2
  • 2025年10月DeepSeek关键词排名优化服务排行榜深度评测与对比分析
  • 2025 年铁芯源头厂家最新推荐排行榜:精准工艺 + 全场景适配实力甄选,年销 400 万只 + 优质企业权威盘点环形铁芯/互感器铁芯厂家推荐
  • MATLAB实现DLT645协议
  • Maui 实践:让 JavaScript 的 this 怪物如同邻居家(强类型)的乖孩子