实例介绍
【实例简介】自定义切面来实现自动保存操作日志
【实例截图】
【实例截图】

【核心代码】
package com.yujy.logaspect.advicd; import com.alibaba.fastjson.JSON; import com.yujy.logaspect.annotation.OperateLog; import com.yujy.logaspect.test.bean.SysOperateLog; import com.yujy.logaspect.test.dao.SysOperateLogDao; import com.yujy.logaspect.vo.base.BaseRequest; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; 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.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.Date; /** * ClassName: OperateLogAdvice <br/> * Description: TODO <br/> * Date: 2021/7/29 14:16<br/> * <br/> * * @author cornyu */ @Aspect @Component @Slf4j public class OperateLogAdvice { @Autowired SysOperateLogDao logDao; @Pointcut("execution( * com.yujy..controller.*.*(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数 public void logPointCut() { } @Before("logPointCut()") public void doBefore(JoinPoint joinPoint) throws Throwable { //接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //记录下请求内容 log.info("请求地址 : " request.getRequestURL().toString()); log.info("HTTP METHOD : " request.getMethod()); log.info("CLASS_METHOD : " joinPoint.getSignature().getDeclaringTypeName() "." joinPoint.getSignature().getName()); log.info("参数 : " JSON.toJSONString(joinPoint.getArgs())); } @AfterReturning(returning = "ret", pointcut = "logPointCut()")//returning的值和doAfterReturning的参数名一致 public void doAfterReturning(Object ret) throws Throwable { //处理完请求 log.info("返回值 : " ret); } @Around("logPointCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long startTime = System.currentTimeMillis(); Object ob = pjp.proceed();//ob为方法的返回值 //执行时长(毫秒) long time = System.currentTimeMillis() - startTime; //保存 请求数据 saveLog(pjp, time); return ob; } private void saveLog(ProceedingJoinPoint joinPoint, long time) { try { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); //获取方法上的自定义注解,如果有标注 OperateLog则往下继续 OperateLog operateLogAnnotation = method.getAnnotation(OperateLog.class); if (operateLogAnnotation == null) { // 注解上的描述 return; } //请求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); //接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String argsStr = JSON.toJSONString(joinPoint.getArgs()[0]); //将第一个请求参数 转为jsonstr BaseRequest baseRequest = JSON.parseObject(argsStr, BaseRequest.class); //请求的参数 保存到数据库中 SysOperateLog sysLog = new SysOperateLog(); String logKey = operateLogAnnotation.key(); sysLog.setCreatetime(new Date()); sysLog.setLogkey(logKey); sysLog.setMethodname(methodName); sysLog.setUsercode(baseRequest.getUserId()); sysLog.setRequestparam(argsStr); sysLog.setTime(BigDecimal.valueOf(time)); logDao.insertSelective(sysLog); } catch (Exception e) { log.error(e.getMessage()); e.printStackTrace(); } } }
. ├── logaspect │ ├── HELP.md │ ├── logaspect.iml │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ ├── src │ │ └── main │ │ ├── java │ │ │ └── com │ │ │ └── yujy │ │ │ └── logaspect │ │ │ ├── LogaspectApplication.java │ │ │ ├── advicd │ │ │ │ └── OperateLogAdvice.java │ │ │ ├── annotation │ │ │ │ └── OperateLog.java │ │ │ ├── config │ │ │ │ └── TestDataSourceConfig.java │ │ │ ├── controller │ │ │ │ └── TestController.java │ │ │ ├── test │ │ │ │ ├── bean │ │ │ │ │ └── SysOperateLog.java │ │ │ │ └── dao │ │ │ │ ├── SysOperateLogDao.java │ │ │ │ └── SysOperateLogDao.xml │ │ │ └── vo │ │ │ └── BaseRequest.java │ │ └── resources │ │ ├── application.properties │ │ ├── db-test-dev.properties │ │ ├── sql │ │ │ └── v1.sql │ │ ├── static │ │ └── templates │ └── target │ ├── classes │ │ ├── application.properties │ │ ├── com │ │ │ └── yujy │ │ │ └── logaspect │ │ │ ├── LogaspectApplication.class │ │ │ ├── advicd │ │ │ │ └── OperateLogAdvice.class │ │ │ ├── annotation │ │ │ │ └── OperateLog.class │ │ │ ├── config │ │ │ │ └── TestDataSourceConfig.class │ │ │ ├── controller │ │ │ │ └── TestController.class │ │ │ ├── test │ │ │ │ ├── bean │ │ │ │ │ └── SysOperateLog.class │ │ │ │ └── dao │ │ │ │ ├── SysOperateLogDao.class │ │ │ │ └── SysOperateLogDao.xml │ │ │ └── vo │ │ │ └── BaseRequest.class │ │ └── db-test-dev.properties │ └── generated-sources │ └── annotations └── 好例子网_logaspect.rar 34 directories, 29 files
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论