`
sjsky
  • 浏览: 917920 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring aop记录Web系统操作日志

阅读更多
    blog迁移至:http://www.micmiu.com

     在建的项目需要实现一个详细记录操作日志的需求:即哪个用户在什么时间做了什么操作,需要把这些日志记录到数据库,提供相应的用户查询、统计以及做一些日志审核。
     项目的基本架构:SSH 即[Spring(v2)、struts(v1)、hibernate(v3)]
     为了减小在建项目人力成本、降低修改程度、降低系统的耦合性,同时该项目spring配置中定义的Action bean的名称比较规范统一,所以就考虑用Spring AOP来完成日志记录。

     代码及详细配置如下:【只是初步设计,如果要记录到数据库,注入相应的service即可
前置消息:LogBeforeAdvice.java
package aoplog;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
import domain.UserAccount;

/**
 * 
 * @author Michael
 */
public class LogBeforeAdvice implements MethodBeforeAdvice {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger
            .getLogger(LogBeforeAdvice.class);

    /**
     * @param method
     * @param args
     * @param target
     * @throws Throwable
     */
    public void before(Method method, Object[] args, Object target)
            throws Throwable {
        UserAccount curUser = null;
        String methodName = "execute";
        for (Object obj : args) {
            if (null == obj) {
                continue;
            }
            if (obj instanceof HttpServletRequest) {
                HttpServletRequest request = (HttpServletRequest) obj;
                curUser = (UserAccount) request.getSession().getAttribute(
                        "HUAXIA_CURRENT_USER");
                if (StringUtils.isNotEmpty(request.getParameter("method"))) {
                    methodName = request.getParameter("method");
                }
            }
        }
        if (null == curUser) {
            logger.info("can not get session user.");
        } else {
            logger.info("operate user:" + curUser.getUserID());
        }
        logger.info("logging before advice. class:"
                + target.getClass().getSimpleName() + " method:" + methodName);

    }
}

后置消息:LogAfterAdvice.java
package aoplog;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
import domain.UserAccount;

/**
 * @author Michael
 */
public class LogAfterAdvice implements AfterReturningAdvice {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(LogAfterAdvice.class);

    /**
     * @param returnObj
     * @param method
     * @param args
     * @param target
     * @throws Throwable
     */
    public void afterReturning(Object returnObj, Method method, Object[] args,
            Object target) throws Throwable {
        UserAccount curUser = null;
        String methodName = "execute";
        for (Object obj : args) {
            if (null == obj) {
                continue;
            }
            if (obj instanceof HttpServletRequest) {
                HttpServletRequest request = (HttpServletRequest) obj;
                curUser = (UserAccount) request.getSession().getAttribute(
                        "HUAXIA_CURRENT_USER");
                if (StringUtils.isNotEmpty(request.getParameter("method"))) {
                    methodName = request.getParameter("method");
                }
            }
        }
        if (null == curUser) {
            logger.info("can not get session user.");
        } else {
            logger.info("operate user:" + curUser.getUserID());
        }
        logger.info("logging after advice. return obj:" + returnObj);
        logger.info("logging after advice. class:"
                + target.getClass().getSimpleName() + " method:" + methodName);
    }
}

spring配置文件部分代码
<!-- aop log cfg 自动代理 -->
	<bean name="logBefore" class="aoplog.LogBeforeAdvice"></bean>
	<bean name="logAfter" class="aoplog.LogAfterAdvice"></bean>
	<bean name="loggerAutoProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>*Action</value>
				<value>*Logout</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>logBefore</value>
				<value>logAfter</value>
			</list>
		</property>
	</bean>

部分日志信息:
INFO - LogBeforeAdvice.before(51) | operate user:admin
INFO - LogBeforeAdvice.before(53) | logging before advice.
       class:UserAccountMainAction method:displayUserAccountMainScreen
INFO - LogAfterAdvice.afterReturning(51) | operate user:admin
INFO - LogAfterAdvice.afterReturning(53) | logging after advice.
       returnobj:ForwardConfig[name=UserAccountMain.screen,
       path=/UserAccountMain.jsp,redirect=false,contextRelative=false,module=null]
INFO - LogAfterAdvice.afterReturning(54) | logging after advice.
       class:UserAccountMainAction method:displayUserAccountMainScreen
1
3
分享到:
评论
2 楼 di1984HIT 2014-04-24  
不错,不错,学习了。
1 楼 mygia 2011-09-20  
转了!单纯这些用过滤器也能做吧?

相关推荐

    Spring AOP简单demo

    4. **日志记录**:记录操作信息,便于追踪和调试。 5. **缓存管理**:在方法调用前检查是否有缓存结果,避免重复计算。 6. **错误处理**:统一处理异常,提供友好的错误信息。 通过学习和实践Spring AOP,开发者...

    Spring AOP 在WEB中的使用

    7. **结合Spring MVC**:在Web应用中,我们常常将AOP用于Controller层的方法拦截,例如进行权限验证、日志记录等。只需确保切入点能够正确匹配Controller的方法,即可实现这些功能。 通过以上步骤,Spring AOP就能...

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

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

    Spring-AOP.rar_spring aop 日志

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

    Spring mvc mybatis plus 实现AOP 切面日志系统

    本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志记录框架,能够自动追踪和记录应用程序的关键操作,同时支持数据持久化到数据库中,方便后期分析和问题排查。下面将详细介绍这些技术...

    springboot基于AOP将web请求写入日志

    本教程将引导新手理解如何利用AOP来记录Web请求日志。下面将详细阐述这个过程。 首先,我们需要了解AOP的基本概念。AOP允许我们在程序执行过程中,在特定的“连接点”(例如方法调用)上插入自定义的行为,这些行为...

    spring aop

    在Web项目中,Spring AOP通常用于处理跨多个控制器和业务层方法的通用任务,如记录请求日志、验证权限、事务管理等。通过配置或注解,你可以确保这些逻辑在每次相关方法执行时自动触发,从而提高代码的可读性和可...

    struts2+spring aop demo

    最后,运行`AspectTestWeb`这个Web应用程序,我们就可以看到AOP如何在Struts2和Spring的联合使用下,无缝地记录操作日志。这样的示例有助于开发者理解如何在实际项目中有效地利用AOP,提高代码的可读性和可维护性,...

    spring aop用到jar包.rar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在使用Spring AOP时,通常需要引入特定的jar包来支持其功能。...

    在自定义spring aop中使用el获取拦截方法的变量值。

    Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被声明性地应用到多个对象上,而无需修改这些对象的代码。Spring AOP通过动态代理实现,有两...

    使用spring aop对web 应用数据进行memcached缓存

    标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...

    Spring boot学习(六)Spring boot实现AOP记录操作日志.pdf

    在本文中,我们将深入探讨如何在Spring Boot项目中利用AOP(面向切面编程)来实现操作日志记录。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以在程序运行时被自动应用到多个点上,比如方法调用之前、...

    SpringAOP的日志管理

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,比如日志、事务管理、性能监控等。在本项目中,我们将深入探讨如何利用Spring AOP进行日志管理...

    Spring AOP 入门作者:廖雪峰

    例如,可以定义一个前置通知来记录每次用户操作的时间和上下文信息,或者定义一个后置通知来处理异常并记录错误日志。 #### 五、编写Advisor增强ServiceBean 在Spring中,可以通过定义`Advisor`来实现AOP。`...

    Spring Aop的简单实现

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本项目中,我们将探讨如何通过配置文件实现Spring AOP...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    Spring AOP+ehCache简单缓存系统解决方案

    首先,Spring AOP是Spring框架的一个核心特性,它允许开发者在不修改源代码的情况下,对应用程序的特定部分进行横切关注点的添加,如日志记录、事务管理或性能监控。AOP通过定义切面(Aspect)和通知(Advice)来...

    SpringMVC+springAOP+spring security+Hibernate整合实例代码

    2. Spring AOP:AOP(面向切面编程)允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。Spring AOP通过代理模式实现了这一概念,可以在不修改原有代码的情况下,在运行时向目标对象添加额外的行为。在...

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    升级到spring.web-3.0.5.jar和spring.webmvc-3.0.5.jar是为了确保你拥有最新的AOP特性和对Servlet API的兼容性。这两个库包含了Spring MVC的实现,Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。`...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

Global site tag (gtag.js) - Google Analytics