• 基于Spring的AOP实现自定义annotation操作日志


    引入项目需要的AOP包

     <!--aop-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>1.5.3</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.6</version>
        </dependency>
        <dependency>
          <groupId>aopalliance</groupId>
          <artifactId>aopalliance</artifactId>
          <version>1.0</version>
        </dependency>
        <dependency>
          <groupId>cglib</groupId>
          <artifactId>cglib</artifactId>
          <version>3.2.4</version>
        </dependency>

    要在springmvc的配置文件里加入配置文件,并指明切点类的的包,好被自动扫描

              <aop:aspectj-autoproxy/>
                <context:component-scan base-package="com..util"/>
                <aop:aspectj-autoproxy proxy-target-class="true" />

    首先编写一个annotation的注解类

    import java.lang.annotation.*;
    @Target({ElementType.PARAMETER, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public  @interface SystemControllerLog {
    
        String description()  default "";
    
    
    }

    其次在编写用户管理的切点类,记录用户操作的的时间,ip,操作

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.lang.reflect.Method;
    import java.util.Date;
    
    
    @Aspect
    @Component
    public class SystemLogAspect {
    
        @Resource
        private EwslogDao ewslogDao;
    
        //Controller层切点,也就是上面那个注解的路径
        @Pointcut("@annotation(com.util.SystemControllerLog)")
        public  void controllerAspect() {
        }
    
        /**
         * 前置通知 用于拦截Controller层记录用户的操作
         *
         * @param joinPoint 切点
         */
        @Before("controllerAspect()")
        public  void doBefore(JoinPoint joinPoint) {
    
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            HttpSession session = request.getSession();
            //读取session中的用户
            User user = (User) session.getAttribute("user");
            String name ="";
            if(user!=null){
                name = user.getUsername();
            }else
                name = "匿名用户";
            //请求的IP
            String ip = request.getRemoteAddr();
            String description="";
            try {
                description = getControllerMethodDescription(joinPoint);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Ewslog ewslog = new Ewslog();
            ewslog.setLoginName(name);
            ewslog.setLogDate(new Date());
            ewslog.setDescription(description);
            ewslog.setIpAddr(ip);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+name);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+description);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+ip);
            ewslogDao.save(ewslog);
    
        }
    
        public  static String getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {
            String targetName = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            Object[] arguments = joinPoint.getArgs();
            Class targetClass = Class.forName(targetName);
            Method[] methods = targetClass.getMethods();
            String description = "";
            for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                    Class[] clazzs = method.getParameterTypes();
                    if (clazzs.length == arguments.length) {
                        description = method.getAnnotation(SystemControllerLog. class).description();
                        break;
                    }
                }
            }
            return description;
        }
    }

    在需要记录的切面类上只需要添加一个注解就可以完成aop了。spring真是太强大了。

      @RequestMapping("/loginOut")
        @SystemControllerLog(description = "用户登出")
        public String index(HttpServletRequest request){
            HttpSession session = request.getSession();
            session.setAttribute("user", null);
           return "../index";
        }
  • 相关阅读:
    已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]
    数据库相关内容 已看1 有用
    JS jquery ajax 已看1 有用
    Web性能优化 高并发网站解决 单例 已看1
    框架和事务 非常 有用 hibernate和mybatis区别
    SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
    客户注册功能,发短信功能分离 通过ActiveMQ实现
    在线下单
    LeetCode -- Count and Say
    LeetCode -- Word Pattern
  • 原文地址:https://www.cnblogs.com/yankang/p/6399024.html
Copyright © 2020-2023  润新知