尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

springboot使用aop切面,记录日志

springboot使用aop切面,记录日志
📅 发布时间:2026/6/17 22:10:01

技术说明:

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记录"),用来记录操作的日志类型即可

相关新闻

  • SqlServer 事务复制的两个参数immediate_sync,allow_anonymous
  • OO之接口-DAO模式代码阅读及应用
  • 发现概率

最新新闻

  • 基于DPDK与OVS-DPDK构建高性能虚拟化网络数据平面实践
  • 西安定制私家团旅行社排行:5家正规机构深度对比 - 起跑123
  • 2026 郑州管城回族区回收渠道测评|上门邮寄品牌排行榜推荐 - 奢侈品回收
  • 2026年《无畏契约》游戏鼠标推荐:新手入门性价比高值得买 - GrowthUME
  • 【2026年6月】中型货架厂家与仓储货架企业推荐指南 - 多才菠萝
  • 2026大连黄金回收市场大整治!正规甄别标准出炉,避坑不踩雷 - 奢侈品回收评测

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号