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
分享到:
相关推荐
4. **日志记录**:记录操作信息,便于追踪和调试。 5. **缓存管理**:在方法调用前检查是否有缓存结果,避免重复计算。 6. **错误处理**:统一处理异常,提供友好的错误信息。 通过学习和实践Spring AOP,开发者...
7. **结合Spring MVC**:在Web应用中,我们常常将AOP用于Controller层的方法拦截,例如进行权限验证、日志记录等。只需确保切入点能够正确匹配Controller的方法,即可实现这些功能。 通过以上步骤,Spring AOP就能...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,主要用来处理系统的横切关注点,如日志记录、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP就是为了...
本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志记录框架,能够自动追踪和记录应用程序的关键操作,同时支持数据持久化到数据库中,方便后期分析和问题排查。下面将详细介绍这些技术...
本教程将引导新手理解如何利用AOP来记录Web请求日志。下面将详细阐述这个过程。 首先,我们需要了解AOP的基本概念。AOP允许我们在程序执行过程中,在特定的“连接点”(例如方法调用)上插入自定义的行为,这些行为...
在Web项目中,Spring AOP通常用于处理跨多个控制器和业务层方法的通用任务,如记录请求日志、验证权限、事务管理等。通过配置或注解,你可以确保这些逻辑在每次相关方法执行时自动触发,从而提高代码的可读性和可...
最后,运行`AspectTestWeb`这个Web应用程序,我们就可以看到AOP如何在Struts2和Spring的联合使用下,无缝地记录操作日志。这样的示例有助于开发者理解如何在实际项目中有效地利用AOP,提高代码的可读性和可维护性,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在使用Spring AOP时,通常需要引入特定的jar包来支持其功能。...
Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被声明性地应用到多个对象上,而无需修改这些对象的代码。Spring AOP通过动态代理实现,有两...
标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...
在本文中,我们将深入探讨如何在Spring Boot项目中利用AOP(面向切面编程)来实现操作日志记录。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以在程序运行时被自动应用到多个点上,比如方法调用之前、...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,比如日志、事务管理、性能监控等。在本项目中,我们将深入探讨如何利用Spring AOP进行日志管理...
例如,可以定义一个前置通知来记录每次用户操作的时间和上下文信息,或者定义一个后置通知来处理异常并记录错误日志。 #### 五、编写Advisor增强ServiceBean 在Spring中,可以通过定义`Advisor`来实现AOP。`...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本项目中,我们将探讨如何通过配置文件实现Spring AOP...
在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...
首先,Spring AOP是Spring框架的一个核心特性,它允许开发者在不修改源代码的情况下,对应用程序的特定部分进行横切关注点的添加,如日志记录、事务管理或性能监控。AOP通过定义切面(Aspect)和通知(Advice)来...
2. Spring AOP:AOP(面向切面编程)允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。Spring AOP通过代理模式实现了这一概念,可以在不修改原有代码的情况下,在运行时向目标对象添加额外的行为。在...
升级到spring.web-3.0.5.jar和spring.webmvc-3.0.5.jar是为了确保你拥有最新的AOP特性和对Servlet API的兼容性。这两个库包含了Spring MVC的实现,Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。`...
在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...