springBoot使用aop添加处理rest请求 打印请求时间 和请求参数

贴上aop配置

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
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 javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Aspect
@Component
public class RestAop {

    /**
     * // 控制是否开启日志
     */
    public static Boolean onOff = false;

    private static Log logger = LogFactory.getLog(RestAop.class);

    @Pointcut("execution(public * com.mybatis.*.web..*.*(..))")
    public void pointCutRestDef() {
    }

    @Around("pointCutRestDef()")
    public Object processRst(ProceedingJoinPoint point) throws Throwable {
        Object returnValue = null;
        final List<Object> params = new ArrayList<>();
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = sra.getRequest();
        Object[] args = point.getArgs();
        for (int i = 0; i < args.length; i++) {
            Object object = args[i];
            if (object instanceof HttpServletResponse) {
                continue;
            }
            if (object instanceof HttpServletRequest) {
                continue;
            }
            params.add(object);
        }
        logger.info(
                "rest method: " + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
        String cloneParams = JSONObject.toJSONString(params);
        logger.info("rest param: " + cloneParams);
        Long startTime = System.currentTimeMillis();
        try {
            returnValue = point.proceed(point.getArgs());
        } catch (Exception e) {
            // 请求异常处理
            throw e;
        }
        Long endTime = System.currentTimeMillis();
        logger.info("rest  " + request.getRequestURI() + "---used time---" + (endTime - startTime));
        Boolean boolean1 = true;
        if (returnValue != null && !returnValue.equals(boolean1)) {
            System.out.println(JSONObject.toJSONString(returnValue));

        }
        return returnValue;
    }

}

原文地址:https://www.cnblogs.com/guanxiaohe/p/12106240.html

时间: 2024-08-01 08:13:44

springBoot使用aop添加处理rest请求 打印请求时间 和请求参数的相关文章

SpringBoot ------ 使用AOP处理请求

一.AOP统一处理请求日志 1.spring的两大核心:AOP ,  IOC 2.面向对象OOP关注的是将需求功能垂直,划分为不同的,并且相对独立的,   会封装成良好的类,并且类有属于自己的行为. 3.AOP则利用的是一种横切的技术,将面向对象构建的强大的类的体系,进行水平的切割:  并且将那些会影响到多个类的公共行为封装成一个可重用的模块.这个模块称为切面. 4.AOP的关键思想就是:将通用逻辑从业务逻辑中分离出来. 5.结合处理请求打印日志这两种需求来观察这两种思想怎么从垂直和水平来划分的

SpringBoot使用AOP记录请求日志和异常日志

本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar: 起步依赖 web及aop依赖 jpa依赖 mysql驱动 本文着重AOP的使用,你也可以使用自己构建的环境 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类 保存日志的实体类: 日志实体 保存异常的实体类: 异常实体 接下来我们定义一个Operation注

Spring全家桶——SpringBoot之AOP详解

Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. 准备工作 首先,使用AOP要在build.gradle中加入依赖 //引入AOP依赖 compile "org.springframework.boot:spring-boot-starter-aop:${springBootVersion}" 然后在application.yml中

SpringBoot—集成AOP详解(面向切面编程Aspect)

AOP介绍 AOP概述 ??AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释:Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.从关注点中分离出横切关注点是面向切面的程序设计核心概念.分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑代码不需要再包含针对特定领域问题代码的调用,比如一些公用模块的日志.安全等代码. ??代码通过切面抽离,更加整齐和清晰,将重复的代码抽取出来单独的进行维护,在需要

在SpringBoot项目中添加logback的MDC

在SpringBoot项目中添加logback的MDC 先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web controller,在同一时间可能收到来自多个客户端的请求,如果一个请求发生了错误,我们要跟踪这个请求从controller开始一步步都执行到了哪些代码.有哪些log的输出.这时我们可以看log文件,但是log文件是多个请求同时记录的,基本无法分辨哪行是哪个请求产生的,虽然我们可以看线程,但线程可能被复

添加条码生成和打印功能到SQL Server Reporting Services report 中

Barcode Professional for Reporting Services 是一款灵活和强大的.NET组件(.NET DLL 类库),它让您轻松地添加条码生成和打印功能到您的SQL Server Reporting Services report 中.支持几乎所有当前常用的条码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14), EAN 13 & UPC, Postal (USPS, British Royal Mail, Austra

客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法

客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信息如下: CORS概念 支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应. 有一种情况比较特殊,如果我们发送的跨域请求为"非简单请求",浏览器会在发出此请求之前首先发送一个请求类型为OPTIONS的"

Windows 无法打开“添加打印机”。本地打印后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。

安装的win7系统,连接打印机出现 Windows 无法打开"添加打印机".本地打印后台处理程序服务没有运行.请重新启动打印机后台处理程序或重新启动计算机 解决方案: 1.首先先检查一下电脑print spooler服务是否被禁用,经常喜欢用软件优化电脑开机启动,有可能会禁用,如果被禁用,设置为自动启动 2.如果电脑没有print Spooler服务,推荐方法,下载*.reg,解压后直接运行Print Spooler.reg,运行后,重启计算机即可.如果运行失败,注意是否被使用的安全软

未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配

信息: 未能加载视图状态.正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配.例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配. 数据源: System.Web 堆栈信息: 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayLis