SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)

一,加入依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>


二,在src/main/java下的某个包中新建类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * @Auther: cookie
 * @Date: 2018/7/27 10:17
 * @Description: 使用AOP统一处理Web请求日志
 */
@Aspect
@Component
public class WebControllerAop {
      /**
      * 指定切点
      * 匹配 com.example.demo.controller包及其子包下的所有类的所有方法
      */
       @Pointcut("execution(public * com.example.demo.controller.*.*(..))")
       public void webLog(){
        }

     /**
      * 前置通知,方法调用前被调用
      * @param joinPoint
      */
       @Before("webLog()")
       public void doBefore(JoinPoint joinPoint){
           System.out.println("我是前置通知!!!");
           //获取目标方法的参数信息
           Object[] obj = joinPoint.getArgs();
           Signature signature = joinPoint.getSignature();
           //代理的是哪一个方法
           System.out.println("方法:"+signature.getName());
           //AOP代理类的名字
           System.out.println("方法所在包:"+signature.getDeclaringTypeName());
           //AOP代理类的类(class)信息
          signature.getDeclaringType();
           MethodSignature methodSignature = (MethodSignature) signature;
           String[] strings = methodSignature.getParameterNames();
           System.out.println("参数名:"+Arrays.toString(strings));
           System.out.println("参数值ARGS : " + Arrays.toString(joinPoint.getArgs()));
           // 接收到请求,记录请求内容
           ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
           HttpServletRequest req = attributes.getRequest();
           // 记录下请求内容
           System.out.println("请求URL : " + req.getRequestURL().toString());
           System.out.println("HTTP_METHOD : " + req.getMethod());
           System.out.println("IP : " + req.getRemoteAddr());
           System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());

       }

    /**
     * 处理完请求返回内容
     * @param ret
     * @throws Throwable
     */
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        System.out.println("方法的返回值 : " + ret);
    }

    /**
     * 后置异常通知
     * @param jp
     */
    @AfterThrowing("webLog()")
    public void throwss(JoinPoint jp){
        System.out.println("方法异常时执行.....");
    }

    /**
     * 后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
     * @param jp
     */
    @After("webLog()")
    public void after(JoinPoint jp){

    }

    /**
     * 环绕通知,环绕增强,相当于MethodInterceptor
     * @param pjp
     * @return
     */
    @Around("webLog()")
    public Object arround(ProceedingJoinPoint pjp) {
        try {
            Object o =  pjp.proceed();
            return o;
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
    }

}


测试

在controller中随便做的测试:

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable String id){
        User user  = userService.selectByPrimaryKey(id);
        return user;
    }

访问地址:http://localhost:8080/user/1


控制台打印结果

单击查看大图:

原文地址:https://www.cnblogs.com/jpfss/p/11043654.html

时间: 2024-10-08 03:56:09

SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)的相关文章

使用AOP统一处理Web请求日志

pom文件添加依赖 <!--AOP统一处理Web请求日志--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 使用示例: package vxsoft.cn.tts.config; import java.util.Enumerat

Spring Boot中使用AOP统一处理Web请求日志

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.

SpringBoot使用AOP统一处理Web请求日志

<!--aop依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> @Aspect @Component public class WebLogAspect { private static final Logger logge

springboot Aop 统一处理Web请求日志

1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.编写切面类 @Aspect @Component public class WebLogAspect {} 注解 @Aspect 表明这是个切面类 3.定义切点 @Pointcut

SPRINGBOOT9--AOP的使用(本例展示统一处理Web请求日志)

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有: 打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效

SpringBoot2.0+Shiro+JWT 整合

SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编码生成 Token,并在 Token 中加入一些非敏感信息,将其传递. 安装环境 开发工具:STS Maven版本:apache-maven-3.5.2 java jdk 1.8 MySQL版本:5.7 系统:Windows10 一.新建Maven项目 配置Maven项目的pom.xml文件 <pr

springboot2.0+mybatis多数据源集成

最近在学springboot,把学的记录下来.主要有springboot2.0+mybatis多数据源集成,logback日志集成,springboot单元测试. 一.代码结构如下 二.pom.xml文件如下 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation

SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i