zoukankan      html  css  js  c++  java
  • springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜

    具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章

    http://www.cnblogs.com/guokai870510826/p/5977948.html

    好了,回到正题

    1、在拦截之前,我们需要额外的自定义一个注解

    代码如下

    package com.um.framework.baseware.webadmin.modules.controller.core;
    import java.lang.annotation.*;
    @Target({ElementType.PARAMETER, ElementType.METHOD})  
    @Retention(RetentionPolicy.RUNTIME)  
    @Documented 
    public @interface SystemLog {
        String module()  default "";  
        String methods()  default ""; 
    }

    2、aop的实现类中处理记录日志的逻辑

    package com.um.framework.baseware.webadmin.modules.controller.core;
    
    import java.lang.reflect.Method;
    import java.net.InetAddress;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.annotation.Resource;
    import javax.inject.Inject;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.shiro.SecurityUtils;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import com.um.framework.baseware.common.util.GetLocalIp;
    import com.um.framework.baseware.webadmin.modules.impl.manager.log.LogServiceImpl;
    import com.um.framework.baseware.webadmin.modules.services.manager.log.entity.LogEntity;
    
    @Aspect
    public class LogAopAction {
        //注入service,用来将日志信息保存在数据库
        @Resource(name="logService")
        private LogServiceImpl logservice;
        
         //配置接入点,如果不知道怎么配置,可以百度一下规则
         @Pointcut("execution(* com.um.framework.baseware.webadmin.modules.controller..*.*(..))")  
         private void controllerAspect(){}//定义一个切入点
     
         @Around("controllerAspect()")
         public Object around(ProceedingJoinPoint pjp) throws Throwable {
             //常见日志实体对象
             LogEntity log = new LogEntity(); 
             //获取登录用户账户
             HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
             String name = (String) request.getSession().getAttribute("USER_ID");
             log.setUSERID(name);
             //获取系统时间
             String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
             log.setDATA(time);
             
             //获取系统ip,这里用的是我自己的工具类,可自行网上查询获取ip方法
             String ip = GetLocalIp.localIp();
             log.setIP(ip);
             
            //方法通知前获取时间,为什么要记录这个时间呢?当然是用来计算模块执行时间的
             long start = System.currentTimeMillis();
            // 拦截的实体类,就是当前正在执行的controller
            Object target = pjp.getTarget();
            // 拦截的方法名称。当前正在执行的方法
            String methodName = pjp.getSignature().getName();
            // 拦截的方法参数
            Object[] args = pjp.getArgs();
            // 拦截的放参数类型
            Signature sig = pjp.getSignature();
            MethodSignature msig = null;
            if (!(sig instanceof MethodSignature)) {
                throw new IllegalArgumentException("该注解只能用于方法");
            }
            msig = (MethodSignature) sig;
            Class[] parameterTypes = msig.getMethod().getParameterTypes();
            
            Object object = null;
            // 获得被拦截的方法
            Method method = null;
            try {
                method = target.getClass().getMethod(methodName, parameterTypes);
            } catch (NoSuchMethodException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (SecurityException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            if (null != method) {
                // 判断是否包含自定义的注解,说明一下这里的SystemLog就是我自己自定义的注解
                if (method.isAnnotationPresent(SystemLog.class)) {
                    SystemLog systemlog = method.getAnnotation(SystemLog.class);
                    log.setMODULE(systemlog.module());
                    log.setMETHOD(systemlog.methods());
                    try {
                        object = pjp.proceed();
                        long end = System.currentTimeMillis();
                        //将计算好的时间保存在实体中
                        log.setRSPONSE_DATA(""+(end-start));
                        log.setCOMMITE("执行成功!");
                        //保存进数据库
                        logservice.saveLog(log);
                    } catch (Throwable e) {
                        // TODO Auto-generated catch block
                        long end = System.currentTimeMillis();
                        log.setRSPONSE_DATA(""+(end-start));
                        log.setCOMMITE("执行失败");
                        logservice.saveLog(log);
                    }
                } else {//没有包含注解
                    object = pjp.proceed();
                }
            } else { //不需要拦截直接执行
                object = pjp.proceed();
            }
            return object;
         }
    }

    然后整个业务就处理完了

    3、看一下怎么使用

    在controller中使用注解

    4、日志的实体对象属性

    数据库表就不用说了吧,和实体字段对应起来就ok了

    看一下数据库表中记录的数据

    至此,aop处理日志就处理完了

  • 相关阅读:
    Hbase表的管理
    Hbase指定规则扫描表
    vim配置
    caogao
    go on shell
    实习总结
    shell 脚本
    hadoop实战
    awk使用
    java reflect
  • 原文地址:https://www.cnblogs.com/guokai870510826/p/5981015.html
Copyright © 2011-2022 走看看