首页 > 其他分享 >spring boot aop 中获取requestbody参数

spring boot aop 中获取requestbody参数

时间:2023-11-04 09:22:56浏览次数:35  
标签:log point spring boot request requestbody org import aspectj

package com.xkcoding.log.aop.aspectj;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
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 cn.hutool.json.JSONUtil;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.extern.slf4j.Slf4j;

/**
 * @author www.gaozz.club
 * @功能描述 aop 中获取requestbody参数
 * @date 2018-08-26
 */
@Aspect
@Component
@Slf4j
public class AopLog {
    private static final String START_TIME = "request-start";

    /**
     * 切入点
     */
    @Pointcut("execution(public * com.xkcoding.log.aop.controller.*Controller.*(..))")
    public void log() {

    }

    /**
     * 前置操作
     *
     * @param point 切入点
     */
    @Before("log()")
    public void beforeLog(JoinPoint point) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        log.info("【请求 URL】:{}", request.getRequestURL());
        log.info("【请求 IP】:{}", request.getRemoteAddr());
        log.info("【请求类名】:{},【请求方法名】:{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName());
        log.info("【body】:{},", JSONUtil.toJsonStr(point.getArgs()));
        Map<String, String[]> parameterMap = request.getParameterMap();
        log.info("【请求参数】:{},", JSONUtil.toJsonStr(parameterMap));
        Long start = System.currentTimeMillis();
        request.setAttribute(START_TIME, start);
    }

    /**
     * 环绕操作
     *
     * @param point 切入点
     * @return 原方法返回值
     * @throws Throwable 异常信息
     */
    @Around("log()")
    public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();
        log.info("【返回值】:{}", JSONUtil.toJsonStr(result));
        return result;
    }

    /**
     * 后置操作
     */
    @AfterReturning("log()")
    public void afterReturning() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();

        Long start = (Long) request.getAttribute(START_TIME);
        Long end = System.currentTimeMillis();
        log.info("【请求耗时】:{}毫秒", end - start);

        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);
        log.info("【浏览器类型】:{},【操作系统】:{},【原始User-Agent】:{}", userAgent.getBrowser().toString(), userAgent.getOperatingSystem().toString(), header);
    }
}

 

来源:https://www.jianshu.com/p/183ef7afc472

 

标签:log,point,spring,boot,request,requestbody,org,import,aspectj
From: https://www.cnblogs.com/chen-msg/p/17808879.html

相关文章

  • SpringBoot中的扩展和解耦思想
    你可能会有这样的疑问:在SpringBoot中,为什么不直接使用一个Service写功能,而是Service接口+ServiceImpl实现类?当项目比较简单的时候,需求明确,变更不频繁或者几乎不怎么修改的时候,用第一种就好了当项目比较复杂,需求变更多的时候,用第二种比较好这种方式的好处有:解耦合便于扩展......
  • MySQL数据库事务隔离级别、Spring事物传播行为
    MySQL数据库事务隔离级别1什么是事务事务就是保障一系列的操作统一执行,要嘛全部成功,要嘛全部失败。事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,......
  • springboot的自动装配机制
    ·自动配置的Tomcat,SpringMvc等只需要导入场景,容器中就会自动配置好这个场景的核心组件容器中有什么组件,就具备什么样的功能·默认的包扫描规则@SpringBootApplication标注的类就是主程序类SpringBoot只会扫描主程序所在的包及其下......
  • 在线点餐系统(课设) springboot 免费源码
    项目源码获取方式见文章末尾处项目技术数据库:Mysql8.0数据表数:5张开发工具:idea前端技术:Springboot+MybatisPlus后端技术:BootStrap+Thymeleaf功能简介该项目是一个在线点餐系统,分为用户端和商家端。商家端:    登录/注册    首页    菜单管理    订单管理   ......
  • 使用Spring Data JPA,您可以通过定义接口,面来避免Object[]以更优雅的格式返回数据,sql
    使用SpringDataJPA,您可以通过定义接口,面来避免Object[]以更优雅的格式返回数据,sql的返回值和接口的属性名一致。jap会根据sql返回值映射到接口对应属性。cas*_*lin6根据定义,JPA将返回Object[]查询返回带有投影的列表的列表,即来自实体(或多个实体)的一组字段.使用......
  • Prometheus接入(四、Spring Boot接入)
    环境CentOS7.9+SpringBoot2.6.8安装1、依赖引入<!--预设监控--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></depen......
  • Spring @Value注入Date类型变量
    @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@Value("${dateValue:2023-11-0100:00:00}")privateDatenoWxMomentsEnableDateStr; ......
  • springboot + maven + war
    参考文档:springboot配置https://blog.csdn.net/weixin_42594143/article/details/132651455maven项目打war包https://blog.csdn.net/yuanpeij/article/details/120563593https://blog.51cto.com/u_16099190/63531951、项目启动类在SpringBoot应用中,如果需要将应......
  • MISBoot低代码开发平台、IT人员的福音!
        近年来,随着各行各业对数字经济、业务数字化的重视,发展,强化数字技术创新应用,全面推进企业数字化转型工作。在全国各行业数字化转型的浪潮中,低代码通过可视化、模块化开发操作,降低软件开发门槛,强化资源扩展和信息集成,助力各行业数字化发展。    作为当前软件开发领......
  • SpringBoot自动装配(二)源码分析
    基于SpringBoot2.7.11step1.从EnableAutoConfiguration注解开始注解@EnableAutoConfiguration开启了自动配置然后SpringBoot在启动的时候通过类路径进行扫描查找所有META-INF/spring.factories文件加载其中所有的自动配置类step2.应用启动@SpringBootApplicationpub......