`

基于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";
    }

 

 

 

cankao http://blog.csdn.net/qq_24486393/article/details/52201915

 

分享到:
评论

相关推荐

    SpringMVC利用AOP实现自定义注解记录日志

    总结,Spring MVC结合AOP和自定义注解可以方便地实现日志记录功能,无需侵入业务代码。这种方法具有良好的可扩展性和灵活性,可以轻松适应不同场景的日志需求。同时,通过调整切面的定义,我们可以控制日志记录的...

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar

    spring AOP自定义注解方式实现日志管理的实例讲解

    Spring AOP 自定义注解方式实现日志管理的实例讲解 在本文中,我们将探讨如何使用 Spring AOP 实现日志管理,并使用自定义注解方式来记录日志信息。这种方式可以灵活地实现日志管理,提高系统的可维护性和可扩展性...

    spring aop 自定义缓存实现

    本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring AOP的基本概念。AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在...

    Spring aop 记录操作日志 Aspect 源码

    本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect和注解实现这一功能。 首先,我们要理解Spring AOP的基本概念。AOP是面向对象编程(OOP)的一种补充,它专注于处理那些横向的、与业务逻辑无关...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    理解Spring AOP实现与思想 案例代码

    2. **Spring AOP实现方式** - **代理模式**:Spring AOP使用两种代理方式,JDK动态代理和CGLIB代理。如果目标类实现了接口,Spring会使用JDK动态代理;如果没有实现接口,Spring会使用CGLIB代理生成子类。 - **JDK...

    Spring之AOP在鉴权和日志记录中的应用

    本篇将深入探讨如何利用Spring AOP来实现鉴权和日志记录。 **二、AOP基础知识** 1. **切面(Aspect)**:AOP的核心概念,它封装了关注点,如日志记录或权限验证。一个切面通常包含一个或多个通知(advice)。 2. ...

    Spring aop 性能监控器

    可以查看Spring AOP的实现,尤其是`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`和`org.springframework.aop.aspectj.AspectJExpressionPointcut`这两个类,它们分别处理了...

    SpringAOP.zip

    Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    Spring boot学习(六)Spring boot实现AOP记录操作日志.pdf

    总结来说,Spring Boot结合AOP能够有效地实现操作日志的自动化记录,通过自定义注解和切面,我们可以轻松地将日志记录集成到业务代码中,同时还能灵活地调整日志级别和输出方式,满足不同场景的需求。

    spring AOP日志框架

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改源代码的情况下,通过在程序运行时动态地插入代码来实现横切关注点,如日志记录、事务管理、性能监控等。在Spring AOP中,日志框架...

    Spring_aop_annotation.zip

    本实践项目以"Spring_aop_annotation.zip"为载体,展示了如何利用注解在Spring框架中实现AOP的功能。下面将详细阐述该项目中的关键知识点。 一、Spring AOP概念 AOP是Aspect Oriented Programming的缩写,它是一种...

    利用 spring annotation AOP 反射 记录日志

    当然,除了手动编写切面和切入点,Spring还支持基于注解的切点表达式,可以直接在被代理的方法上使用`@Loggable`等自定义注解,然后在切面中解析并处理这些注解,以达到相同的效果。 在实际应用中,我们可能还需要...

    SpringAOP结合ehCache实现简单缓存实例

    Spring AOP是Spring框架的一部分,它允许我们在不修改业务代码的情况下,通过定义“切面”来插入额外的功能,如日志记录、事务管理、性能监控等。AOP的核心概念包括切点(Pointcut)、通知(Advice)和切面(Aspect...

    Spring基础:Spring AOP简单使用

    Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它扩展了传统的面向对象编程(OOP),使得开发者能够更好地处理系统中的横切关注点,如日志、事务管理、权限控制等。...

    spring aop API示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现代码的横切关注点,如日志记录、事务管理、性能监控等。在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四...

    学习Spring笔记_AOP_Annotation实现和XML实现

    这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...

    对spring aop 各个组件进行实现

    在没有自定义注解的情况下,我们可以使用Spring AOP的其他匹配规则,如基于方法名的匹配。例如,我们可以在切面类中定义一个`@After`方法,指定在所有以"index2"结尾的方法执行后执行: ```java @Component @...

Global site tag (gtag.js) - Google Analytics