SpringBoot Aop打印参数

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * @author kelin.ll
 * @date on 2019/6/5
 */
@Aspect
@Component
@Slf4j
public class AuthAspect {/**
     * 这个切点的表达式需要根据自己的项目来写
     * 说明:
     * execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
     * 修饰符匹配(modifier-pattern?)
     * 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
     * 类路径匹配(declaring-type-pattern?)
     * 方法名匹配(name-pattern)可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法
     * 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用","隔开,各个参数也可以用"*"来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数
     * 异常类型匹配(throws-pattern?)
     * 其中后面跟着"?"的是可选项
     *
     * 如:
     *   1)execution(* *(..))   表示匹配所有方法
     *   2)execution(public * com. savage.service.UserService.*(..))  表示匹配com.savage.server.UserService中所有的公有方法
     *   3)execution(* com.savage.server..*.*(..))  表示匹配com.savage.server包及其子包下的所有方法
     */
    @Pointcut("execution(public * com.anole.manager.controller.RealTimeApiController.*(..))")
    public void auth() {

    }

    @Before("auth()")
    public void doBefore(JoinPoint joinPoint) {
        log.info("aop doBefore..");
        ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //url
        log.info("url={}", request.getRequestURI());

        //method
        log.info("method={}", request.getMethod());

        //ip
        log.info("ip={}", request.getRemoteAddr());

        //类方法
        log.info("classMethod={}",
            joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());

        //参数
        Enumeration paramter = request.getParameterNames();
        while (paramter.hasMoreElements()) {
            String str = (String)paramter.nextElement();
            log.info(str + "={}", request.getParameter(str));
        }

    }

    @Around("auth()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        // 耗时计算-开始
        stopWatch.start();
        ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //参数
        Enumeration paramter = request.getParameterNames();
        while (paramter.hasMoreElements()) {
            String str = (String)paramter.nextElement();
            log.info(str + "={}", request.getParameter(str));
        }
        // TODO 可在此处实现鉴权逻辑,修改返回response
        Object returnObj = proceedingJoinPoint.proceed();
        // 耗时计算-结束
        stopWatch.stop();
        log.info("【{}方法】耗时:{}", proceedingJoinPoint.getSignature().getName(), stopWatch.getTotalTimeMillis());
        return returnObj;
    }

    @After("auth()")
    public void doAfter() {
        log.info("aop doAfter");
    }
}

Original: https://www.cnblogs.com/gisblogs/p/10999202.html
Author: GisClub
Title: SpringBoot Aop打印参数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540899/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JVM垃圾回收阅读笔记

    Java内存运行时区域的各个部分, 其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中…

    Java 2023年6月7日
    061
  • 69.修炼爱情

    dfsd posted @2022-09-28 08:46 随遇而安== 阅读(17 ) 评论() 编辑 Original: https://www.cnblogs.com/55z…

    Java 2023年6月7日
    051
  • Linux安装nginx,使用nginx做图片服务器

    nginx官网:http://nginx.org/download/ 这里使用的是nginx-1.8.0.tar.gz进行安装 首先安装GCC编辑器: 执行下面命令即可,前提: 必…

    Java 2023年6月9日
    066
  • nginx配置http为1.0到1.1

    转载自:https://blog.csdn.net/u014558668/article/details/79237020 需求:接口通过nginx转发服务器,接收不到数据,但是测…

    Java 2023年5月30日
    076
  • Maven不能不关注啦

    项目依赖 模拟版本冲突 除了compile其他scope不会传递 继承 导入 聚合 项目依赖 项目B引用项目A,如果项目A没有在本地仓库(自己建立的项目,先不说远程仓库)则项目B执…

    Java 2023年6月8日
    082
  • 【力扣】98. 验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须…

    Java 2023年6月8日
    083
  • 延时队列我在项目里是怎么实现的?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 前阵子,有个小伙伴找到问我,如果要实现 延时发送,那是基于什么来做的。 我看到这个问题…

    Java 2023年6月9日
    070
  • Spring 源码(2)Spring IOC 容器 前戏准备工作

    Spring 最重要的方法refresh方法 根据上一篇文章 https://www.cnblogs.com/redwinter/p/16141285.html Spring Be…

    Java 2023年6月14日
    072
  • Apollo的docker配置详解步骤

    Apollo 的docker配置 基础环境 centOS7 + Docker服务 + mysql服务 1. 下载Apollo的包 git clone https://github….

    Java 2023年6月9日
    073
  • JAVA压缩ZIP文件

    csharp;gutter:true; public static void main(String[] args) throws IOException { String pat…

    Java 2023年5月29日
    074
  • Spring Cloud Gateway 请求报文获取 高性能实现方法

    1 简介 本文使用的spring cloud版本:2020.0.1 关于Spring Cloud Gateway报文获取,网上写法较多参考ModifyRequestBodyGate…

    Java 2023年5月30日
    070
  • SpringCloud : 接入 微信公众号平台(四)、获取微信用户信息接口

    代码参考: import com.phpdragon.wechat.proxy.config.WeChatConfig; import com.phpdragon.wechat.p…

    Java 2023年5月30日
    084
  • Linux centos7.6 安装 docker

    1、安装官网教程 https://docs.docker.com/engine/install/centos/ 2、卸载之前的 docker sudo yum remove doc…

    Java 2023年6月5日
    070
  • 参加了个算法比赛,真是一言难尽啊

    hello大家好呀,我是小楼。 上周参加了一个区的程序员技能比赛的初赛,其实就是算法比赛,虽然最后结果是过了初赛,但过程真是一言难尽啊。 这次的算法比赛和ACM非常类似,虽然我大学…

    Java 2023年6月6日
    088
  • spring-retry使用

    Spring Retry提供了自动重新调用失败的操作的功能。这在错误可能是暂时性的(例如瞬时网络故障)的情况下很有用。Spring Retry提供对流程和基于策略的行为的声明式控制…

    Java 2023年5月30日
    095
  • 基于UML软件建模的企业人事管理系统

    前言 随着信息技术的发展和互联网环境的成熟,管理信息系统的技术更新函待解决。人事管理工作虽然由企业人事管理人员((HR)等负责,但随着企业规模的不断扩大,如果所有工作全部由HR来做…

    Java 2023年6月5日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球