日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring AOP 切面记录操作日志

發(fā)布時間:2024/3/12 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring AOP 切面记录操作日志 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

實際業(yè)務(wù),有時候需要記錄服務(wù)的操作日志,我們可以利用SpringAOP 切面來攔截記錄用戶操作;用戶使用session或者前端傳值都可以。

1.創(chuàng)建日志記錄接口

首先我們得有一個接口,這個接口可以記錄用戶訪問服務(wù)器的方法
例:

//合并 import java.lang.annotation.*;@Target(ElementType.METHOD) //注解放置的目標位置,METHOD是可注解在方法級別上 @Retention(RetentionPolicy.RUNTIME) //注解在哪個階段執(zhí)行 @Documented //生成文檔 public @interface MyLog {String value() default ""; }

2.使用接口

注解使用

注:你想捕獲那個方法用戶操作,就給那個方法加注解,不需要的忽略

@GetMapping("/deleteServiceByServNo")@MyLog(value = "刪除服務(wù)")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);//請求的參數(shù)Object[] args = joinPoint.getArgs();//過濾HttpServletRequest和HttpServletResponse類型的參數(shù)List<Object> logArgs = streamOf(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))).collect(Collectors.toList());String argStr = JSON.toJSONString(logArgs);//將參數(shù)所在的數(shù)組轉(zhuǎn)換成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

總結(jié)

以上是生活随笔為你收集整理的Spring AOP 切面记录操作日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。