1. 程式人生 > >spring aop 實現使用者操作日誌記錄功能

spring aop 實現使用者操作日誌記錄功能

首先寫好一個工具類 LogAspect.java

package com.yangjf.commons;
import java.lang.reflect.Method;
import java.util.Date;
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.springframework.beans.factory.annotation.Autowired;
import com.yangjf.entity.Admin;
import com.yangjf.entity.Log;
import com.yangjf.service.LogService;

@Aspect
public class LogAspect {
	
	public Integer id=null; 
	
	@Autowired
	LogService logService;
	
	/**
	 * 管理員登入方法的切入點
	 */
	@Pointcut("execution(* com.yangjf.service.*.login(..))")
	public void loginCell(){
	}
	
	/**
	 * 新增業務邏輯方法切入點
	 */
	@Pointcut("execution(* com.yangjf.service.*.save(..))")
	public void insertCell() {
	}

	/**
	 * 修改業務邏輯方法切入點
	 */
	@Pointcut("execution(* com.yangjf.service.*.update(..))")
	public void updateCell() {
	}

	/**
	 * 刪除業務邏輯方法切入點
	 */
	@Pointcut("execution(* com.yangjf.service.*.delete(..))")
	public void deleteCell() {
	}
	
	/**
	 * 登入操作(後置通知)
	 * @param joinPoint
	 * @param object
	 * @throws Throwable
	 */
	@AfterReturning(value = "loginCell()", argNames = "object", returning = "object")
	public void loginLog(JoinPoint joinPoint, Object object) throws Throwable {
		Admin admin=(Admin)object;
		if (admin==null) {
			return;
		}
		if (joinPoint.getArgs() == null) {// 沒有引數
			return;
		}
		id=admin.getId();
		// 獲取方法名
		String methodName = joinPoint.getSignature().getName();
		// 獲取操作內容
		String opContent = optionContent(joinPoint.getArgs(), methodName);
		
		Log log = new Log();
		log.setContent(opContent);
		log.setAdminId(admin.getId());
		log.setCreateDate(new Date());
		log.setOperation("登入");
		logService.insertLog(log);
	}
	
	/**
	 * 新增操作日誌(後置通知)
	 * 
	 * @param joinPoint
	 * @param object
	 */
	@AfterReturning(value = "insertCell()", argNames = "object", returning = "object")
	public void insertLog(JoinPoint joinPoint, Object object) throws Throwable {
		// Admin admin=(Admin)
		// request.getSession().getAttribute("businessAdmin");
		// 判斷引數
		if (joinPoint.getArgs() == null) {// 沒有引數
			return;
		}
		// 獲取方法名
		String methodName = joinPoint.getSignature().getName();
		// 獲取操作內容
		String opContent = optionContent(joinPoint.getArgs(), methodName);

		Log log = new Log();
		log.setContent(opContent);
		 log.setAdminId(id);;
		log.setOperation("新增");
		log.setCreateDate(new Date());
		logService.insertLog(log);
	}

	/**
	 * 管理員修改操作日誌(後置通知)
	 * 
	 * @param joinPoint
	 * @param object
	 * @throws Throwable
	 */
	@AfterReturning(value = "updateCell()", argNames = "object", returning = "object")
	public void updateLog(JoinPoint joinPoint, Object object) throws Throwable {
		// Admin admin=(Admin)
		// request.getSession().getAttribute("businessAdmin");

		// 判斷引數
		if (joinPoint.getArgs() == null) {// 沒有引數
			return;
		}
		// 獲取方法名
		String methodName = joinPoint.getSignature().getName();
		// 獲取操作內容
		String opContent = optionContent(joinPoint.getArgs(), methodName);

		// 建立日誌物件
		Log log = new Log();
		log.setContent(opContent);
		log.setAdminId(id);
		log.setOperation("修改");// 操作
		log.setCreateDate(new Date());
		logService.insertLog(log);
	}

	/**
	 * 刪除操作
	 * 
	 * @param joinPoint
	 * @param object
	 */
	@AfterReturning(value = "deleteCell()", argNames = "object", returning = "object")
	public void deleteLog(JoinPoint joinPoint, Object object) throws Throwable {
		// Admin admin=(Admin)
		// request.getSession().getAttribute("businessAdmin");
		// 判斷引數
		if (joinPoint.getArgs() == null) {// 沒有引數
			return;
		}
		// 獲取方法名
		String methodName = joinPoint.getSignature().getName();

		StringBuffer rs = new StringBuffer();
		rs.append(methodName);
		String className = null;
		for (Object info : joinPoint.getArgs()) {
			// 獲取物件型別
			className = info.getClass().getName();
			className = className.substring(className.lastIndexOf(".") + 1);
			rs.append("[引數,型別:" + className + ",值:(id:"
					+ joinPoint.getArgs()[0] + ")");
		}

		// 建立日誌物件
		Log log = new Log();
		log.setContent(rs.toString());
		log.setAdminId(id);
		log.setOperation("刪除");// 操作
		log.setCreateDate(new Date());
		logService.insertLog(log);
	}

	/**
	 * 使用Java反射來獲取被攔截方法(insert、update)的引數值, 將引數值拼接為操作內容
	 * 
	 * @param args
	 * @param mName
	 * @return
	 */
	public String optionContent(Object[] args, String mName) {
		if (args == null) {
			return null;
		}
		StringBuffer rs = new StringBuffer();
		rs.append(mName);
		String className = null;
		int index = 1;
		// 遍歷引數物件
		for (Object info : args) {
			// 獲取物件型別
			className = info.getClass().getName();
			className = className.substring(className.lastIndexOf(".") + 1);
			rs.append("[引數" + index + ",型別:" + className + ",值:");
			// 獲取物件的所有方法
			Method[] methods = info.getClass().getDeclaredMethods();
			// 遍歷方法,判斷get方法
			for (Method method : methods) {
				String methodName = method.getName();
				// 判斷是不是get方法
				if (methodName.indexOf("get") == -1) {// 不是get方法
					continue;// 不處理
				}
				Object rsValue = null;
				try {
					// 呼叫get方法,獲取返回值
					rsValue = method.invoke(info);
				} catch (Exception e) {
					continue;
				}
				// 將值加入內容中
				rs.append("(" + methodName + ":" + rsValue + ")");
			}
			rs.append("]");
			index++;
		}
		return rs.toString();
	}

}

aop在applicationcontext.xml的配置

<!-- 日誌 -->
<aop:aspectj-autoproxy />
<bean id="logBean" class="com.yangjf.commons.LogAspect"></bean>


相關推薦

spring aop 實現使用者操作日誌記錄功能

首先寫好一個工具類 LogAspect.java package com.yangjf.commons; import java.lang.reflect.Method; import java.util.Date; import org.aspectj.lang.Join

Springboot 如何使用AOP同時織入多個切面?實現使用者 操作日誌記錄功能

首先匯入AOP的pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

Spring Aop實現簡單日誌記錄

日誌類 package com.jusfoun.estate.log.domain; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java

Spring Aop+註解實現日誌記錄

系統業務操作日誌記錄是每個系統必不可少的一部分,但通常的做法是在每個需要記錄日誌的地方,呼叫新增日誌的Service方法,這樣做主要是顯的麻煩。 我們可以使用Spring AOP結合註解來實現這一功能。 1、首先定義一個註解類,如下: @Target(

ssm框架整合AOP,實現日誌記錄功能

在ssm框架中,實現一個切面日誌功能,起碼要掌握的知識有四點: 以下是自己之前做的一個專案,希望對你們有幫助 1:先定義一個自定義註解類 @Target({METHOD, TYPE}) @Retention(RetentionPolicy.RUNTIME) @In

Spring AOP完成資料庫日誌記錄

在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一

springboot—spring aop 實現系統操作日誌記錄存儲到數據庫

work prop 請求 pack spa 成功 方法 代碼 shu 原文:https://www.jianshu.com/p/d0bbdf1974bd 采用方案: 使用spring 的 aop 技術切到自定義註解上,針對不同註解標誌進行參數解析,記錄日誌

使用Spring AOP自定義註解方式實現使用者操作日誌記錄

1,開發環境 作業系統:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定義註解類UserLog @Target({ElementType.PARAMETER, ElementType.METHOD}) @R

Spring AOP 自定義註解記錄操作日誌

1.自定義註釋 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface Log { LogType type() default Lo

Spring Aop實現使用者操作日誌記錄

package com.jixi.controller; import com.jixi.pojo.Log; import com.jixi.pojo.User; import com.jixi.service.ILogService; import com.jixi.service.IUserServic

利用Java Annotation 和 Spring AOP實現在Controller層面的操作日誌記錄

Annotation,Spring,AOP之類的概念這裡就不在介紹了,網上的相關知識一搜在大堆,而且也是各大公司面試之必考內容。目前AOP技術的應用場景中應該很大一部分是用來實現操作日誌記錄的,由於每個公司幾乎都有自己的開發框架,而且很多框架都對CRUD之類的操作進行了高度

Spring AOP 切面編程記錄日誌和接口執行時間

poi follow 大牛 日誌打印 mave ont type exceptio throw 最近客戶現在提出系統訪問非常慢,需要優化提升訪問速度,在排查了nginx、tomcat內存和服務器負載之後,判斷是數據庫查詢速度慢,進一步排查發現是因為部分視圖和表查詢特別慢導致

整合springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap實現許可權管理檔案上傳下載多資料來源切換操作日誌記錄功能

花了兩週,學習了下springboot,然後做個小東西練練手.專案基於jdk1.8+maven整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技術,springboot+Listener(監聽器),Filter

基於Spring AOP和Groovy日誌模板配置的日誌記錄框架的二次實現與使用案例

一、專案地址 說明:本框架是基於koala-project(專案地址:http://git.oschina.net/openkoala/koala)中的koala-businesslog二次開發,因為koala-project已經很久沒有維護,對於一些

SpringBoot 中的aop配置,完成日誌記錄功能

第一步:在pom.xml下新增依賴 因為springboot已經新增過日誌記錄功能的依賴 <!-- 核心模組,包括自動配置支援、日誌支援 --> <dependency> <groupId>org.s

《web工程aop實現前臺操作日誌記錄》初稿

寫日誌功能很繁瑣,博主廢了一些時間寫出來分享,用的ssm框架,後期會設定優先順序,避免所有方法都會被記錄到日誌。開始: 1、首先定義一個自定義註解@controllerLog和@serviceLog package com.hhwy.business.annotation

spring配置日誌切面,實現系統操作日誌記錄

//做系統是經常會遇到的情況之一,對系統操作日誌存表記錄 下面給出下例子 需要注意的是,日誌通常資料量會很大,建議已每個人月一張表,或者其他方式分表 例如:logs_2012_1             logs_2012_2             logs_2012_

利用SpringMVC的AOP來實現後臺系統的操作日誌記錄

最近在專案中要求把後臺的一些關鍵操作記錄下來,想了好半天能想到的也就那兩三種方式,要麼就是寫一個攔截器,然後再web.xml裡面進行配置,要麼就是就是在每個需要記錄操作日誌的程式碼裡面進行攔截,最後我選擇了第三種,也就是基於AOP的攔截,用這種方式,只需要在需記

曹工說Spring Boot原始碼(20)-- 碼網灰灰,疏而不漏,如何記錄Spring RedisTemplate每次操作日誌

寫在前面的話 相關背景及資源: 曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享 曹工說Spring Boot原始碼(2)-- Bean Definition到底是什麼,咱們對著介面,逐個方法講解 曹工說Spring Boot原始碼(3)--

曹工說Spring Boot原始碼(20)-- 碼網恢恢,疏而不漏,如何記錄Spring RedisTemplate每次操作日誌

# 寫在前面的話 相關背景及資源: [曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享](https://www.cnblogs.com/grey-wolf/p/12044199.html) [曹工說Spring Boot原始碼(2)--