解决方案

package com.hailiu.web.aop;import com.fasterxml.jackson.databind.ObjectMapper;
import com.hailiu.model.Log;
import com.hailiu.security.user.AuthenticationUser;
import com.hailiu.service.ILogService;
import com.hailiu.web.bean.ResponseBean;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/*** AOP记录用户操作日志** @author ShenTuZhiGang* @version 1.0.0* @date 2021-03-21 18:34*/
@Aspect
@Component
public class WebLogAspect {private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(WebLogAspect.class);private final ObjectMapper objectMapper;private final ILogService iLogService;public WebLogAspect(ObjectMapper objectMapper, ILogService iLogService) {this.objectMapper = objectMapper;this.iLogService = iLogService;}/*** Controller层切点*/@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")public void controllerAspect(){}@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint) {logger.info("before");}@Around("controllerAspect()")public Object around(ProceedingJoinPoint pjp) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();Signature signature = pjp.getSignature();Log log = new Log();log.setHttpMethod(request.getMethod());log.setHttpUri(request.getRequestURI());log.setHttpUserAgent(request.getHeader("User-Agent"));log.setHttpRemoteHost(request.getRemoteHost());log.setClassName(signature.getDeclaringTypeName());log.setMethodName(signature.getName());// 处理请求参数StringBuilder params = new StringBuilder();String[] paramNames = ((MethodSignature) signature).getParameterNames();Object[] paramValues = pjp.getArgs();int paramLength = null == paramNames ? 0 : paramNames.length;if (paramLength == 0) {log.setHttpParams("{}");} else {params.append("[");for (int i = 0; i < paramLength ; i++) {if(i > 0){params.append(",");}params.append(paramNames[i]).append("=").append(objectMapper.writeValueAsString(paramValues[i]));}params.append("]");}log.setHttpParams(params.toString());log.setOperator(-1);Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication != null && authentication.isAuthenticated()) {AuthenticationUser user = (AuthenticationUser) authentication.getPrincipal();if(user != null){log.setOperator(user.getId());}}log.setOperationName("普通操作");Long start = System.currentTimeMillis();try{logger.info("before around");Object o = pjp.proceed();logger.info("after around");if(o instanceof ResponseBean){ResponseBean<?> response = (ResponseBean<?>) o;log.setStatus(response.getStatus());log.setMsg(response.getMsg());log.setIsFail(response.getStatus() != 200);}else{log.setIsFail(false);}log.setIsError(false);return o;}catch (Exception e){log.setStatus(500);log.setMsg("内部错误");log.setIsFail(true);log.setIsError(true);//return ResponseBean.error("内部错误");throw e;}finally {Long end = System.currentTimeMillis();log.setExecuteTime((int) (end - start));iLogService.save(log);}}@After("controllerAspect()")public void doAfter(JoinPoint joinPoint){logger.info("after");}@AfterThrowing(pointcut = "controllerAspect()",throwing = "e")public void doAfterThrowing(JoinPoint joinPoint,Throwable e){logger.info("after throwing");}@AfterReturning(pointcut = "controllerAspect()",returning = "response")public void doAfterReturning(JoinPoint joinPoint, ResponseBean<?> response){logger.info("after returning");}
}

参考文章

springboot + AOP 日志

springboot项目使用切面记录用户操作日志

Spring Boot启用http请求日志记录(访问日志)

Spring Boot——基于AOP的HTTP操作日志解决方案相关推荐

  1. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

  2. Spring Boot整合ELK 处理为服务日志,妙!

    你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. 编辑:业余草 developer.ibm.com 推荐:https://www.xttblog.com/?p=5 ...

  3. Spring Boot:(六)默认日志logback配置解析

    Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...

  4. spring boot请求后缀匹配的操作

    这篇文章主要介绍了spring boot 请求后缀匹配的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 spring boot 请求后缀匹配 spring boo ...

  5. Spring Boot + MDC 实现全链路调用日志跟踪

    写在前面 通过本文将了解到什么是MDC.MDC应用中存在的问题.如何解决存在的问题 MDC介绍 简介: MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j .l ...

  6. Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅)

    Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅) 1. 配置环境 在SpringBoot2.0版本以后,原来使用的jedis被替换成为了let ...

  7. Spring BOOT ( 基于Kotlin 编程语言) 使用 Spring WebFlux 实现响应式编程

    Spring BOOT ( 基于Kotlin 编程语言) 使用 Spring WebFlux 实现响应式编程 image.png 参考文档:https://docs.spring.io/spring/ ...

  8. Spring boot基于redis实现附近的人(附源码下载)

    此文章是针对去年写的Java基于Redis实现"附近的人 进行业务优化! 核心源码 public class NearbyPO {@NotNull(message = "id值不能 ...

  9. Spring AOP 切面记录操作日志

    前言 实际业务,有时候需要记录服务的操作日志,我们可以利用SpringAOP 切面来拦截记录用户操作:用户使用session或者前端传值都可以. 1.创建日志记录接口 首先我们得有一个接口,这个接口可 ...

最新文章

  1. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink——flink支持SQL,待看
  2. 学Python10大理由:功能多、资源多、挣钱多!
  3. FreeBSD 6.0架设管理与应用-附录B 制作FreeBSD安装光盘
  4. Nodejs【单机】多进程模式集群
  5. 如何创建新的SAP CRM middleware subscription
  6. 学生机房管理服务器系统设计,广东工业大学数据库课程设计机房管理系统设计...
  7. 进入opencv内部函数调试
  8. android app性能优化_Android性能优化之Apk 瘦身优化
  9. 排序算法总结(四)快速排序【QUICK SORT】
  10. oracle rac防护,Oracle RAC日常基本维护命令
  11. 5.中小型企业通用自动化运维架构 -- ELK
  12. Android 四大组件学习之Service七
  13. jdbc mysql url写法_Springboot项目连接MySql写了一个bug你也可能遇到
  14. python和ruby性能比较_Ruby和Python的比较
  15. 人工智能机器学习数据挖掘重要会议日期
  16. 沪深股票的复权计算(复权因子的应用)
  17. Python Web开发技巧III
  18. python 练习洗牌
  19. 2020h黑苹果 y7000p_拯救者Y7000黑苹果升级macOS 10.15.4分享
  20. [Vulhub] ThinkPHP漏洞合集

热门文章

  1. 最后一天,最后一刻。。。。。。情理之中,意料之外。。。。。。
  2. linux 脚本中除法运算符,Linux中Shell的算数运算符和位运算符用法笔记
  3. linux lpte_linux常用命令
  4. 2019小程序没必要做了_企业有必要开发微信小程序吗?
  5. python调用hive与java调用区别_Python操作Hive的两种方法总结
  6. xss 跨站脚本漏洞 php,跨站脚本漏洞(XSS)基础讲解
  7. html5如何传递值,如何将var中的值传递到另一个var
  8. go mongodb排序查询_「赵强老师」MongoDB中的索引(下)
  9. 十、Go协程的调度,互斥锁,计数器和线程池
  10. 五、Hive架构,安装和基本使用