zoukankan      html  css  js  c++  java
  • Spring aop 记录操作日志 Aspect 自定义注解

    时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题

    所需jar包 :spring4.3相关联以及aspectjweaver-1.8.5.jar,jdk  1.7,1.8亲测可用,源码下载链接放在最后,关键代码如下:

    1.Action

    package com.opr.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.opr.service.UserService;
    
    @Controller
    @RequestMapping("user")
    public class UserController {
        
        @Autowired UserService userService;
        
        /***
         * 首页
         * @param request
         * @param response
         * @return ModelAndView
         */
        @RequestMapping("index")
        public ModelAndView index(HttpServletRequest request,HttpServletResponse response) {
            return new ModelAndView("index");
        }
    
        /***
         * 登录
         * @param request
         * @param response
         * @return ModelAndView
         */
        @RequestMapping("userLogin")
        public ModelAndView userLogin(HttpServletRequest request,HttpServletResponse response,
                String userName,String password) {
            ModelAndView mv = new ModelAndView();
            try {
                
                boolean result = userService.userLogin(userName,password);
                if(result) {
                    mv.setViewName("success");
                }else {
                    mv.setViewName("error");
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
            return mv;
            
        }
    
    }

    2.Service

    package com.opr.service.impl;
    
    import org.springframework.stereotype.Service;
    
    import com.opr.annotation.OperLog;
    import com.opr.service.UserService;
    
    @Service("userService")
    public class UserServiceImpl implements UserService {
        //设置默认值,模拟登录
        private final String userName = "admin";
        
        private final String password = "123456";
        
        @Override
        @OperLog(operType="用户登录",userIndex = 0 )//0为下标,代表传入的第一个参数,这里取userName为示例。实际场景可以在session中取操作人!
        public boolean userLogin(String userName,String password) {
            boolean flag = false;
            
            if(this.userName.equals(userName) && this.password.equals(password)) {
                flag = true;
            }
            
            return flag;
        }
    
    }

    3.自定义注解

    package com.opr.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    //这里不明白的童鞋可以抽空看看自定义注解
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface OperLog {
        
        //操作类型
        String operType() default "";
        //操作人
        String user() default "";
        //操作人下标
        int userIndex() default -1;
        
    }

    4.拦截器

    package com.opr.interceptor;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    import com.opr.annotation.OperLog;
    
    @Aspect
    @Component
    public class OperLogInterceptor {
        //这里写的为环绕触发 ,可自行根据业务场景选择@Before @After
        //触发条件为:com.opr包下面所有类且注解为OperLog的
        @Around("within(com.opr..*) && @annotation(operLog)")
        public Object doAroundMethod(ProceedingJoinPoint pjd,OperLog operLog) throws Throwable {
            long startTime=System.currentTimeMillis();//开始时间
            
            Object[] params = pjd.getArgs();//获取请求参数
            System.out.println("监听到传入参数为:");
            for(Object param:params) {
                System.out.println(param);
            }
            
            //###################上面代码为方法执行前#####################
            Object result  = pjd.proceed();//执行方法,获取返回参数
            //###################下面代码为方法执行后#####################
            System.out.println("返回参数为:" + result);
            
            String user = operLog.userIndex()==-1?operLog.user():(String)params[operLog.userIndex()];//操作人
            String operType = operLog.operType();//操作类型
            System.out.println("操作人: " + user +" 操作类型: " + operType);
            
            long endTime=System.currentTimeMillis();//结束时间
            float excTime=(float)(endTime-startTime)/1000;
            System.out.println("执行时间:"+excTime+"s");
            System.out.println("#######################分隔符##########################");
            return result;
            
        } 
        
        
    }

    5.Spring

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="http://www.springframework.org/schema/beans        
              http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/context                
            http://www.springframework.org/schema/context/spring-context-4.3.xsd
            http://www.springframework.org/schema/aop                
            http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
            http://www.springframework.org/schema/mvc                    
            http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
    
        <!-- 设置扫描目录 -->
        <context:component-scan base-package="com.opr" />
    
        <!-- 设置请求映射器 -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    
        <!-- 设置适配器处理器 -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
          
          <!-- 设置视图处理器 -->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="/WEB-INF/jsp/"/>
              <property name="suffix" value=".jsp" />
          </bean>
          
          <aop:aspectj-autoproxy proxy-target-class="true" />
          
          
    </beans>

    6.运行项目后

    7.成功

      1).前端效果:

      

      2).后台打印:

      

    8.失败

      1).前端效果:

      

      2).后台打印:

       

    源码下载地址:http://download.csdn.net/download/qq_16437937/10188600

    吐槽一下:CSDN下载最低为2分,分不够的可以邮箱@我,或者在下面留下你的邮箱,我看到了就会发你

    邮箱为:Leifeiwangyi@163.com

    有什么问题可以留言咱们讨论讨论,谢谢大家

  • 相关阅读:
    批归一化(Batch Normalization)
    NLP | 文本风格迁移 总结
    LeetCode: Word Ladder
    LeetCode: Longest Consecutive Sequence
    LeetCode: Sum Root to Leaf Numbers
    LeetCode: Surrounded Regions
    LeetCode: Palindrome Partition
    LeetCode: Clone Graph
    LeetCode: Gas Station
    LeetCode: Candy
  • 原文地址:https://www.cnblogs.com/leifei/p/8194644.html
Copyright © 2011-2022 走看看