springAop日志管理

        在软件的使用过程当中,对用户的行为及用户的操作进行跟踪分析,这也是相当重要的一个模块,那么如何实现用户的日志管理呢?

        首先用户的日志管理这个模块要很容易潜入当前的系统中,不能影响当前系统的正常运行。这样在技术方面当然有很多种实现方法。在spring2+struts2+hibernate3的系统架构中,实现用户日志管理功能,我们可以采用struts2拦截器,也可以采用spring的切面编程思路。下面我们采用spring aop来实现用户的日志功能。

1、首先定义一个切面类。bsrAfterReturningAdvice

       在spring的配置文件中可以这样申明

    

  1. <aop:config proxy-target-class="true">
  2.          <aop:pointcut id="actionPointcut" expression="execution(* com.liuxing..*.*Action.*()throws *Exception))"/>
  3.          <aop:aspect id="goLogAspect" ref="liuxingAfterReturningAdvice">
  4.                          <aop:after-returning pointcut-ref="actionPointcut" method="writeLogInfo"/>
  5.          </aop:aspect>
  6. </aop:config>
  7.     <bean id="liuxingAfterReturningAdvice" class="com.liuxing.annotation.LiuxingAfterReturningAdvice" >

在这里我们定义了一个类LiuxingAfterReturningAdvice,这个类是一个切面类,同时我们定义了一个spring的拦截器,这个拦截器拦截符合条件的所有action的所有方法。将这些action拦截之后有我们定义好的切面类来处理。

2、切面类的实现如下。

  1. import java.lang.reflect.Method;
  2. import java.lang.reflect.Field;
  3. import java.net.InetAddress;
  4. import com.liuxing.annotation.UserLogInfoService;
  5. import com.liuxing.annotation.UserLogInfo;
  6. import com.liuxing.util.ApplicationContextFactory;
  7. import org.springframework.context.ApplicationContext; 
  8. import org.apache.struts2.ServletActionContext;
  9. import org.aspectj.lang.JoinPoint;
  10. import com.liuxing.commons.Constants;
  11. import com.liuxing.domain.BaseObject;
  12. import com.liuxing.domain.sys.SysUser;
  13. import com.liuxing.util.TimeHelper;
  14. public class LiuxingAfterReturningAdvice {
  15.     private UserLogInfoService userLogInfoService;
  16.     private UserLogInfoAction userLogInfoAction;
  17.     private UserLogInfo userLogInfo;
  18.     public void writeLogInfo(JoinPoint joinPoint) throws Exception,IllegalAccessException{
  19.         //try{
  20.         SysUser sysUser = (SysUser)ServletActionContext.getRequest().getSession().getAttribute(Constants.SESSION_USER_KEY);
  21.         System.out.println(joinPoint.getStaticPart().toShortString());
  22.         String temp=joinPoint.getStaticPart().toShortString();
  23.         String classType=joinPoint.getTarget().getClass().getName();
  24.         String methodName=temp.substring(10, temp.length()-1);
  25.         Class className=Class.forName(classType);
  26.         Method method=className.getMethod(methodName, new Class[]{});
  27.         Field field;
  28.         if(method.isAnnotationPresent(GoaAnnotation.class)){
  29.             GoaAnnotation goaAnnotation=method.getAnnotation(GoaAnnotation.class);
  30.             String operateDescribe=goaAnnotation.operateDescribe();
  31.             System.out.println("添加在方法前面的描述是:"+operateDescribe);
  32.             System.out.println("用户"+sysUser.getUserName()+"进行了"+operateDescribe+"操作");
  33.             userLogInfo=new UserLogInfo();
  34.             {//为用户日志实体赋值
  35.                 userLogInfo.setSysUser(sysUser);
  36.                 userLogInfo.setUserIp(ServletActionContext.getRequest().getRemoteAddr());
  37.                 userLogInfo.setUserOperateContent(operateDescribe);
  38.                 userLogInfo.setUserOperateTime(TimeHelper.getCurrentTime());
  39.                 userLogInfoService=(UserLogInfoService)ApplicationContextFactory.getApplicationContext().getBean("userLogInfoService");
  40.                 userLogInfoService.save(userLogInfo);
  41.             }
  42.             
  43.         }
  44.     }
  45.     public UserLogInfoService getUserLogInfoService() {
  46.         return userLogInfoService;
  47.     }
  48.     public void setUserLogInfoService(UserLogInfoService userLogInfoService) {
  49.         this.userLogInfoService = userLogInfoService;
  50.     }
  51.     public UserLogInfoAction getUserLogInfoAction() {
  52.         return userLogInfoAction;
  53.     }
  54.     public void setUserLogInfoAction(UserLogInfoAction userLogInfoAction) {
  55.         this.userLogInfoAction = userLogInfoAction;
  56.     }
  57.     
  58. }

当一个方法被拦截掉后,将在此类进行处理,将用户的操作信息写入UserLogInfo实体,存入数据库。同事我们要在被拦截的类中加一个自定义的annotation,这也是非常关键的。

3、自定义的annotaion

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.METHOD)
  3. public @interface GoaAnnotation {
  4.     String operateDescribe();
  5. }

 

4、在每一个要被拦截的方法前面加上自定义的注释。

如:

 

  1. @GoaAnnotation(operateDescribe="保存基本信息")
  2.     public String save() throws Exception {
  3.         

 

这样,我们在切面处理类中能够获取到这个注释的类容,同事能够得到调用的方法名,这样我们可以知道当前用户调用的方法,即进行了什么样的业务操作。我们的日志工作基本完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值