spring aop记录Web系统操作日志

[color=red]blog迁移至[/color]:[url=http://www.micmiu.com]http://www.micmiu.com[/url]

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

代码及详细配置如下:【[color=red]只是初步设计,如果要记录到数据库,注入相应的service即可[/color]】
[color=blue]前置消息:LogBeforeAdvice.java[/color]
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);

}
}

[color=blue]后置消息:LogAfterAdvice.java[/color]
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);
}
}

[color=blue]spring配置文件部分代码[/color]

<!-- 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>

[color=blue]部分日志信息:[/color]
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值