springboot使用aop切面,记录日志

news/2025/10/20 13:20:40/文章来源:https://www.cnblogs.com/smfx1314/p/19152424

技术说明:

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.mzph.cn/news/941143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【整活】OI的那些奇妙小操作(Part 1)

卡时 在C++里,有(double)clock()/CLOCKS_PER_SEC这一行代码可以获得当前已经运行的时间。 初见端倪,也就是说,当你使用一些暴力算法(暴搜)的时候,你可以通过计算当前已经运行的时间并判断是否将要超时,如果要超…

想学习的数学

空闲时间想多学习一些基础数学课,虽然以前也学过,但是没有写一些笔记 比如: 泛函分析 范畴论 测度论 暑期班的优化笔记也可以整理一下,还一些可逆遇见的矩阵的性质,以为比较散乱,所以遇到了再整理。本文来自博客园…

详细介绍:Streamlit:CSS——从基础到实战美化应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SqlServer 事务复制的两个参数immediate_sync,allow_anonymous

SqlServer 事务复制的两个参数immediate_sync,allow_anonymousSqlServer的事务复制中,immediate_sync和allow_anonymous两个参数会影响到复制的后台行为和分发库(distribution)的数据保留方式,这两个参数单从名字…

OO之接口-DAO模式代码阅读及应用

1. StudenDaoListImpl.java 与 StudentDaoArrayImpl.java 有何不同?StudenDaoListImpl 使用 ArrayList 存储学生对象,可以动态扩容,无需指定初始大小。StudentDaoArrayImpl 使用固定长度的 Student[] 数组存储学生对…

个微协议,微信号二次开发/ipad协议

优势 我们是一家专业服务企业数字化微信管理服务的技术团队,服务于需求SCRM、机器人、营销系统、社群小助手等具有研发能力的企业,同时我们也接收因使用Xp方案、ipad方案、PC方案导致被批量封号的企业,我们合作伙伴目…

Win11设置默认打开全部右键菜单

前言Win11 的右键菜单默认是折叠起来,很多功能需要点击“显示更多选项”才能显示,非常不方便。 方法打开 CMD 运行下面命令,然后重启电脑即可。reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c…

屏幕显示发白难题的硬件工程深度排查:架构兼容性边界分析

屏幕显示发白难题的硬件工程深度排查:架构兼容性边界分析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

发现概率

5.1.3 发现概率模型的求解 发现概率的核心特征是累积性与不可逆性: 单雷达需连续3个扫描周期(窗口大小 $w = 3$)探测成功才判定"发现",且一旦某时刻满足"发现"条件,后续所有时刻的发现状态需…

MySQL索引查看语句show index详解

一、概述 SHOW INDEX语句是MySQL中用于查看表索引信息的语句。它提供了有关表中索引的详细信息,包括索引名称、索引类型、关联的列等。 二、语法与概要描述 SHOW INDEX语句的语法如下: SHOW INDEX FROM table_name […

qzmoot 生活合集

qzmoot 生活合集欣赏穿蛋侠; 摸彭云; 跳缩小版《我是奶龙》。

yocto工程升级要点

需求 原有的工程是多年前基于yocto sumo开发,对应的linux kernel版本是4.14。 需求是要求linux kernel升级到5.10。 背景 工程由以下几部分组成,yocto sumo构建部分的代码,包括poky,bitbake等 目标平台支持多款第三…

微信机器人开发API!3步搞定微信聊天机器人

微信机器人开发API!3步搞定微信聊天机器人 WTAPI框架是一个能将个人微信各项功能提取成可供开发人员调用的一套私有API接口,比如微信的收发消息,发朋友圈,群聊,建群等等都是可以用API接口来做的。你可以用 微信机…

详细介绍:【Linux】Linux管道与进程池深度解析:从原理到实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windows2019的域控服务器更新时间.251020

1 先找到合适的源 w32tm /stripchart /computer:ntp.aliyun.com #若是可以使用会显示如下图2 注册表配置确****保NTP客户端已启用:确认以下注册表路径的 E nabled 值为 1: HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo…

国内DOH解析速度测试(阿里 腾讯 360 Doh测速)

阿里 腾讯 360 Doh测速以前一直用阿里DOH,上个月开始明显感觉网页打开速度异常慢,怀疑是阿里DOH限速,验证过程如下: 测试工具:Python3.14 aiohttp matplotlib numpy dnspython 库 地理位置:阳江(距离省会偏远的落后城市…

WatchAlert 轻量级AI日志告警 - Docker安装部署

💎 WatchAlert 是什么? 🎯 专注可观测性与稳定性,为运维提效降本 WatchAlert 是一款专为云原生环境设计 的轻量级监控告警引擎,聚焦于可观测性(Metrics、Logs、Traces)与系统稳定性保障,提供从采集、分析到告…

2022ICPC区域赛济南站

补题链接QOJ:The 2022 ICPC Asia Jinan Regional Contest - Dashboard - Contest - QOJ.ac K. Stack Sort 思路:考虑 a 需要比 a+1 先出栈,所以如果读到 a,发现 a+1 还没被记录则需要多建一个栈。 void solve() {i…

java代码和c++代码相互调用的技术方案

java代码和c++代码相互调用的技术方案通过JNI桥接方式

详细介绍:MyBatis动态sql

详细介绍:MyBatis动态sql2025-10-20 12:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…