`
sungang_1120
  • 浏览: 322474 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

spring AOP记录日志

阅读更多
package com.supinfo.jieneng.aop;

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 org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

import com.supinfo.core.base.ServiceManager;
import com.supinfo.jieneng.domains.Admin;
import com.supinfo.jieneng.domains.Log;
import com.supinfo.util.DataUtil;

/**
 * 管理员操作日志记录
 * @author 
 *	
 */
@Aspect
public class LogAspect {
	
	@Autowired
	private ServiceManager serviceManager;
	
	//操作
	private static final String OP_UPDATE = "修改";
	private static final String OP_INSERT = "添加";
	private static final String OP_DELETE = "删除";
    /**
     * 筛选方法:
     * 
     */
	/*后台管理添加操作*/
    @Pointcut("execution(* com.supinfo.jieneng.services.*.insert*(..))")
    public void insertCall() { }
    
    @Pointcut("execution(* com.supinfo.jieneng.services.*.add*(..))")
    public void addCall() { }
    
    @Pointcut("execution(* com.supinfo.jieneng.services.*.save*(..))")
    public void saveCall() { }
    
    
    @Pointcut("( insertCall() || addCall() || saveCall() )")
    public void allInsertCall(){}
    
    /*后台管理修改操作*/
    @Pointcut("execution(* com.supinfo.jieneng.services.*.update*(..))")
    public void updateCall() { }
    @Pointcut("execution(* com.supinfo.jieneng.services.*.modify*(..))")
    public void modifyCall() { } 
    
    @Pointcut("( updateCall() || modifyCall() )")
    public void allUpdateCall() { }
    
    /*后台管理员删除*/
    @Pointcut("execution(* com.supinfo.jieneng.services.*.delete*(..))")
    public void deleteCall() { }
    @Pointcut("execution(* com.supinfo.jieneng.services.*.remove*(..))")
    public void removeCall() { }
    
    @Pointcut("(deleteCall() || removeCall())")
    public void allDeleteCall() { }
   
    
    
	/**
	 * 获取登录管理员ID
	 * 
	 * @return
	 */
	private Long loginUserId() {

		if(SecurityContextHolder.getContext() == null){
			return null;
		}
		
		if(SecurityContextHolder.getContext().getAuthentication() == null){
			return null;
		}
		
		UserDetails userDetails = (UserDetails) SecurityContextHolder
				.getContext().getAuthentication().getPrincipal();
		
		if(userDetails == null){
			return null;
		}
		
		String userName = userDetails.getUsername();
		
		if(DataUtil.isNullOrEmpty(userName)){
			return null;
		}
		
		// 根据用户名获取用户ID
		Admin admin = serviceManager.getAdminService().findAdminByNickname(userName);
		
		if(admin == null){
			return null;
		}
		
		return admin.getId();
	}
	
    /**
     * 管理员修改操作日志
     * @param joinPoint
     * @param rtv
     * @throws Throwable
     */
	@AfterReturning(value="allUpdateCall()", argNames="rtv", returning="rtv")
    public void allUpdateCallAfterCalls(JoinPoint joinPoint, Object rtv) throws Throwable{
		
		Long adminUserId = loginUserId();
		if(adminUserId == null){//没有管理员登录
			return;
		}
		
		//判断参数
		if(joinPoint.getArgs() == null){//没有参数
			return;
		}
		
		//获取操作方法名
		String optionMethodName = joinPoint.getSignature().getName();
		
		Log log = new Log();
		//用户编号
		log.setUserid(loginUserId());
		log.setCreatedate(new Date());
		//设置日志内容
		log.setContent(DataUtil.adminOptionContent(joinPoint.getArgs(),optionMethodName));
		log.setOperation(OP_UPDATE);
		serviceManager.getLogService().log(log);
	}
	
    /**
     * 管理员添加操作日志
     * @param joinPoint
     * @param rtv
     * @throws Throwable
     */
	@AfterReturning(value="allInsertCall()", argNames="rtv", returning="rtv")
    public void allInsertCallAfterCalls(JoinPoint joinPoint, Object rtv) throws Throwable{
		
		Long adminUserId = loginUserId();
		if(adminUserId == null){//没有管理员登录
			return;
		}
		
		//判断参数
		if(joinPoint.getArgs() == null){//没有参数
			return;
		}
		
		//获取操作方法名
		String optionMethodName = joinPoint.getSignature().getName();
		
		Log log = new Log();
		//用户编号
		log.setUserid(loginUserId());
		log.setCreatedate(new Date());
		//设置日志内容
		log.setContent(DataUtil.adminOptionContent(joinPoint.getArgs(),optionMethodName));
		log.setOperation(OP_INSERT);
		serviceManager.getLogService().log(log);
	}
	/**
	* @Description:  管理员删除日志记录
	* @方法名: allDeleteCallAfterCalls
	* @param : @param joinPoint
	* @param : @param rtv
	* @return void    返回类型
	* @throws 
	 */
	@AfterReturning(value="allDeleteCall()", argNames="rtv", returning="rtv")
	public void allDeleteCallAfterCalls(JoinPoint joinPoint,Object rtv) throws Throwable{
		Long adminUserId = loginUserId();
		if(adminUserId == null){//没有管理员登录
			return;
		}
		
		//判断参数
		if(joinPoint.getArgs() == null){//没有参数
			return;
		}
		//获取操作方法名
		String optionMethodName = joinPoint.getSignature().getName();
		
		Log log = new Log();
		//用户编号
		log.setUserid(loginUserId());
		log.setCreatedate(new Date());
		//设置日志内容
		log.setContent(DataUtil.adminOptionContent(joinPoint.getArgs(),optionMethodName));
		log.setOperation(OP_DELETE);
		serviceManager.getLogService().log(log);
	}
}

 

 

下面是通过反射 获取当前操作对象的参数值:

 

/**
	* @Description: 使用Java反射来获取被拦截方法(insert、update,delete)的参数值
	* @方法名: adminOptionContent
	* @param : @param args 参数
	* @param : @param optionMethodName 操作方法名
	* @return String    返回类型
	 */
	public static String adminOptionContent(Object[] args,String optionMethodName) throws Exception {

		if (args == null) {
			return null;
		}

		StringBuffer rs = new StringBuffer();
		
		//判断用户是 删除  修改 添加操作类型
		if (optionMethodName.startsWith("delete") || optionMethodName.startsWith("remove")) {
			//方法名
			rs.append("删除操作方法名:" + optionMethodName);
		}else if (optionMethodName.startsWith("insert") || optionMethodName.startsWith("add") || optionMethodName.startsWith("save")) {
			rs.append("添加操作方法名:" + optionMethodName);
		}else if (optionMethodName.startsWith("update") || optionMethodName.startsWith("modify")) {
			rs.append("修改操作方法名:" + optionMethodName);
		}
	
		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方法 不是get方法
				if (methodName.indexOf("get") == -1) {
					continue;
				}

				Object rsValue = null;
				try {
					// 调用get方法,获取返回值
					rsValue = method.invoke(info);
					// 没有返回值
					if (rsValue == null) {
						continue;
					}
				} catch (Exception e) {
					continue;
				}

				// 将值加入内容中
				rs.append("(" + methodName + " : " + rsValue + ")");
			}

			rs.append("]");

			index++;
		}

		return rs.toString();
	}

 

 

Spring XML配置:

 <!-- 加入Aspectj 注解配置启动 -->  
<aop:aspectj-autoproxy />  
<!-- 日志 记录 AOP注入 -->
<bean id="logAspect" class="com.supinfo.jieneng.aop.LogAspect"/>	

 

分享到:
评论

相关推荐

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...

    spring aop 操作日志

    本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。

    JAVA 中Spring aop 实现日志记载

    在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...

    spring aop实现日志功能

    标题"spring aop实现日志功能"涉及到的是如何利用Spring AOP来记录和跟踪应用程序中的操作,这对于调试、性能分析和故障排查至关重要。下面我们将详细探讨如何通过Spring AOP来实现日志功能。 首先,理解AOP的基本...

    Spring aop 记录操作日志 Aspect 源码

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在代码中实现横切关注点,如日志记录、权限控制等,而无需侵入业务逻辑。本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面...总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题如日志、事务、安全等方面。

    spring aop 切面添加日志

    通过这个项目,我们可以学习到如何在Spring AOP中实现日志记录,这不仅可以帮助我们调试和监控应用程序,还可以为未来的维护提供宝贵的线索。同时,这也是理解和实践面向切面编程的一个很好的起点。

    swagger和spring Aop日志结合

    6. 结合Swagger UI:Swagger UI可以展示API文档,同时,通过AOP记录的日志可以在后台系统中查看,以便分析API的使用情况。 通过这种方式,我们可以实现对Swagger定义的API的全面日志跟踪,为API的调试、性能优化和...

    spring AOP 切面日志 分层打日志

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...

    spring aop实现接口参数变更前后对比和日志记录

    spring aop实现接口参数变更前后对比和日志记录完整代码,拿到项目代码,只需要做数据库连接的修改即可运行起来使用,代码案例详细,真是可靠,代码原文地址:...

    SpringAOP的日志管理

    总结来说,Spring AOP的日志管理是一个强大的工具,它帮助我们在不干扰业务逻辑的情况下实现日志记录。在MyEclipse中配置Spring库,结合JUnit4进行测试,可以有效地实现和验证这一功能。通过定义切面和通知,我们...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring AOP完整例子

    总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...

    spring aop实现日志分析管理

    通过以上方式,我们可以利用Spring AOP和元注解实现灵活的日志管理和分析,同时确保日志记录对系统性能的影响最小。这在大型Java应用中尤其重要,因为它提供了宝贵的运维数据,有助于问题排查和性能优化。

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    Spring AOP实现机制

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    Spring-AOP.rar_spring aop 日志

    Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,主要用来处理系统的横切关注点,如日志记录、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP就是为了...

Global site tag (gtag.js) - Google Analytics