Spring AOP 切面記錄操作日誌

前言

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

1.創建日誌記錄接口

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

//合併
import java.lang.annotation.*;

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

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 {
	@Autowired
	private 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);

		//獲取ip
		String 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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章