當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring AOP 切面记录操作日志
生活随笔
收集整理的這篇文章主要介紹了
Spring AOP 切面记录操作日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
實際業務,有時候需要記錄服務的操作日志,我們可以利用SpringAOP 切面來攔截記錄用戶操作;用戶使用session或者前端傳值都可以。
1.創建日志記錄接口
首先我們得有一個接口,這個接口可以記錄用戶訪問服務器的方法
例:
2.使用接口
注解使用
注:你想捕獲那個方法用戶操作,就給那個方法加注解,不需要的忽略
@GetMapping("/deleteServiceByServNo")@MyLog(value = "刪除服務")public ReturnMsg deleteServiceByServNo(@RequestParam("servNo")String servNo){interfaceConfigurationService.deleteServiceByServNo(servNo);return new ReturnMsg("200","success");}3.配置切面類 通知
package com.df.security.config; //合并 import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; 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.springframework.util.StreamUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import com.alibaba.fastjson.JSON; import com.df.bean.SysLog; import com.df.bean.User; import com.df.service.IpUtil; import com.df.service.SysLogService; import java.util.stream.*;@Aspect @Component public class SysLogAspect {@Autowiredprivate SysLogService sysLogService;@Pointcut("@annotation(MyLog)")public void logPoinCut() {}//切面 配置通知@AfterReturning("logPoinCut()")public void saveSysLog(JoinPoint joinPoint) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();SysLog sysLog = new SysLog();//從切面織入點處通過反射機制獲取織入點處的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();//獲取切入點所在的方法Method method = signature.getMethod();System.out.println("獲取的方法有:"+method);//獲取操作MyLog myLog = method.getAnnotation(MyLog.class);if (myLog != null) {String value = myLog.value();sysLog.setOperation(value);//保存獲取的操作System.out.println("操作方法名:"+value);}//獲取請求的類名String className = joinPoint.getTarget().getClass().getName();//獲取請求的方法名String methodName = method.getName();sysLog.setMethod(className + "." + methodName);System.out.println("獲取請求的方法名有:"+methodName);//請求的參數Object[] args = joinPoint.getArgs();//過濾HttpServletRequest和HttpServletResponse類型的參數List<Object> logArgs = streamOf(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))).collect(Collectors.toList());String argStr = JSON.toJSONString(logArgs);//將參數所在的數組轉換成json//String params = JSON.toJSONString(args);//sysLog.setParams(params);sysLog.setParams(argStr);//獲取操作用戶HttpServletRequest request = requestAttributes.getRequest();/*HttpSession session = request.getSession();User user=(User) session.getAttribute("user");sysLog.setUserName(user.getUserName());*//*HttpSession session = request.getSession();String userName= (String) session.getAttribute("userName");sysLog.setUserName(userName);*/String userName = request.getHeader("userName");if(userName == null || "".equals(userName)){sysLog.setUserName("dsgc");}else{sysLog.setUserName(userName);}//sysLog.setUserName("admin");User user = (User)request.getSession().getAttribute("user");System.out.println("***操作用戶為***:"+user);if(user!=null){sysLog.setUserName(user.getUserName());}//獲取日期SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String creationDate=df.format(new Date());sysLog.setOpertionDate(creationDate);//獲取ipString ip=IpUtil.getIpAddr(request);sysLog.setIp(ip);//插入本地捕獲用戶操作日志sysLogService.insertSysLog(sysLog);}/* public static void main(String[] args){SysLogAspect sysLogAspect = new SysLogAspect();//sysLogAspect.saveSysLog();}*/public static <T> Stream<T> streamOf(T[] array) {return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.asList(array).stream();}}4.效果圖
祝你幸福
送你一首歌:《還有我》 任賢齊
附圖:解放J7
總結
以上是生活随笔為你收集整理的Spring AOP 切面记录操作日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重庆锦华计算机学校,重庆市渝北区锦华学校
- 下一篇: 华为面试经验总结