當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot AOP记录用户操作日志
生活随笔
收集整理的這篇文章主要介紹了
Spring Boot AOP记录用户操作日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、引入必要依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- aop依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mysql驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!-- druid數據源驅動 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>二、自定義注解
定義一個方法級別的@Log注解,用于標注需要監控的方法:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log {String value() default ""; }三、建立數據表和實體類
數據表:
實體類:
四、日志切面
@Aspect @Component public class UserOperateAspect{@Autowiredprivate SysHandleLogMapper sysHandleLogMapper;@Pointcut("@annotation(com.project.common.annotation.UserOperateLog)")public void pointcut() { }@Around("pointcut()")public Object around(ProceedingJoinPoint point) {Object result = null;long beginTime = System.currentTimeMillis();try {// 執行方法result = point.proceed();} catch (Throwable e) {e.printStackTrace();}// 執行時長(毫秒)long time = System.currentTimeMillis() - beginTime;// 保存日志saveLog(point, time);return result;}private void saveLog(ProceedingJoinPoint joinPoint, long time) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();SysHandleLog sysHandleLog = new SysHandleLog();UserOperateLog logAnnotation = method.getAnnotation(UserOperateLog.class);if (logAnnotation != null) {// 執行的操作sysHandleLog.setOperation(logAnnotation.value());}// 請求的方法名String className = joinPoint.getTarget().getClass().getName();String methodName = signature.getName();sysHandleLog.setMethod(className + "." + methodName + "()");// 請求的方法參數值Object[] args = joinPoint.getArgs();// 請求的方法參數名稱LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();String[] paramNames = u.getParameterNames(method);if (args != null && paramNames != null) {String params = "";for (int i = 0; i < args.length; i++) {if(args[i] instanceof Project) {Class<?> object = args[i].getClass();//獲取實體類的所有屬性,返回Field數組Field[] fields = object.getDeclaredFields();for (Field field : fields) {//field.toString() 格式:private java.lang.String com.project.sys.entity.Project.projectProperty 只需要projectPropertytry {field.setAccessible(true);if (field.get(args[i]) != null && !"".equals(field.get(args[i]))) {params += " " + StringUtils.substringAfterLast(field.toString(), ".") + ": " + field.get(args[i]);}} catch (IllegalAccessException e) {e.printStackTrace();}}}else if(args[i]!=null&&!args[i].equals("")){params += " " + paramNames[i] + ": " + args[i];}}sysHandleLog.setParams(params);}// 獲取requestHttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 獲取ip及地址String IP=IPUtils.getIpAddress(request);sysHandleLog.setIp(IP);sysHandleLog.setLocation(AddressUtils.getAddressByIP(IP).replaceAll("\\d+","").replace("|",""));//獲取用戶名SysUserInfo userInfo= (SysUserInfo) request.getSession().getAttribute(SystemConst.SYSTEM_USER_SESSION);sysHandleLog.setCreateUser(userInfo.getName());sysHandleLog.setSpendTime((int) time);sysHandleLog.setCreateTime(new Date());// 保存系統日志sysHandleLogMapper.insert(sysHandleLog);} }五、控制器
@Controller @RequestMapping("sys-handlelog-info/") public class SysHandleLogController {@Autowiredprivate SysHandleLogService sysHandleLogService;@AutowiredSysHandleLogMapper sysHandleLogMapper;@GetMapping("init")public String init() {return "sys/handlelog/list";}@PostMapping("list")@ResponseBodypublic LayTableResult list(Integer page, Integer limit, SysHandleLog sysHandleLog) {return sysHandleLogService.list(page, limit, sysHandleLog);}@GetMapping("deleteAll")public String deleteAll() {sysHandleLogMapper.deleteHandleLog();return "sys/handlelog/list";} }注:部分dao層代碼沒給出,這里主要給出思路
總結
以上是生活随笔為你收集整理的Spring Boot AOP记录用户操作日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一周之内,如何快速摸清一个行业?
- 下一篇: 中台产品经理能力模型