SpringAOP如何修改请求参数列表

 更新时间:2023年03月07日 16:41:11   作者:CAT_cwds  
这篇文章主要介绍了SpringAOP如何修改请求参数列表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringAOP修改请求参数列表

如题,今天遇到了一个问题,要批量在前端请求之后修改其中的一个参数值。

我使用SpringAop拦截请求去修改参数值,因为Spring Aop是无法直接根据参数名获取参数的,所以使用MethodSignature首先获取当前方法的参数列表,找到对应参数的下标,然后根据下标获取当前参数对应的值。

代码如下:

private final String execution = "execution(* com.zxy.test.degitaltool.tree.controller.TestController.*(..))";
 
    /**
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around(execution)
    public Object before(ProceedingJoinPoint pjp) throws Throwable {
        Method method = ((MethodSignature) pjp.getSignature()).getMethod();
        Parameter[] parameters = method.getParameters();
        int keyIndex = getKeyIndex2(parameters, "treeId");
        Object[] args = pjp.getArgs();
        if (keyIndex != -1) {
            String value = args[keyIndex];//找到对应的值
            ...
        }
        return pjp.proceed(args);//修改参数值
    }
 
    private int getKeyIndex2(Parameter[] parameters, String key) {
        for (int i = 0; i < parameters.length; i++) {
            if (Objects.equals(parameters[i].getName(), key)) {
                return i;
            }
        }
        return -1;
    }

SpringAOP获取参数名参数值

有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名、参数值。

环境:

  • Mac OSX
  • Intellij IDEA
  • Spring Boot 2x
  • Jdk 1.8x 

Code: 

package com.example.aopdemo.aop;
 
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.CodeSignature;
import org.springframework.stereotype.Component;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * DemoAop
 * Create by Gray(Ganguocai@outlook.com)
 */
@Aspect
@Component
@Slf4j
public class DemoAop {
 
    /**
     * 环绕通知
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around(value = "execution(* com.example.aopdemo..*(..)))")
    public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        
        log.debug("执行前:");
        
        Map<String, Object> params = getNameAndValue(proceedingJoinPoint);
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            System.out.println("name: " + entry.getKey() + " value: " + entry.getValue());
        }
        
        Object object = proceedingJoinPoint.proceed();  //执行连接点方法,object:方法返回值
        
        log.debug("执行后:");
        
        return object;
    }
    /**
     * 获取参数Map集合
     * @param joinPoint
     * @return
     */
    Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
        Map<String, Object> param = new HashMap<>();
        Object[] paramValues = joinPoint.getArgs();
        String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
        for (int i = 0; i < paramNames.length; i++) {
            param.put(paramNames[i], paramValues[i]);
        }
        return param;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot集成Kafka进行批量消费及踩坑点

    Springboot集成Kafka进行批量消费及踩坑点

    本文主要介绍了Springboot集成Kafka进行批量消费及踩坑点,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Springboot启用多个监听端口代码实例

    Springboot启用多个监听端口代码实例

    这篇文章主要介绍了Springboot启用多个监听端口代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 自定义类加载器的父类为何是AppClassLoader说明

    自定义类加载器的父类为何是AppClassLoader说明

    这篇文章主要介绍了自定义类加载器的父类为何是AppClassLoader说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java日期时间字符串和毫秒相互转换的方法

    Java日期时间字符串和毫秒相互转换的方法

    这篇文章主要为大家详细介绍了Java日期时间字符串和毫秒相互转换的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 聊聊SpringBoot整合Nacos自动刷新配置的问题

    聊聊SpringBoot整合Nacos自动刷新配置的问题

    Nacos作为SpringBoot服务的注册中心和配置中心,本例将在配置文件中配置一个 cml.age=100 的配置项,程序中编写一个方法读取配置文件,并通过 Get--->/test/age 接口提供给浏览器访问,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

    Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先搜索(DFS)和广度优先搜索(BFS)是两种基本的图搜索算法,可用于图的遍历、路径搜索等问题。DFS采用栈结构实现,从起点开始往深处遍历,直到找到目标节点或遍历完整个图;BFS采用队列结构实现,从起点开始往广处遍历,直到找到目标节点或遍历完整个图
    2023-04-04
  • java模拟实现银行ATM机操作

    java模拟实现银行ATM机操作

    这篇文章主要为大家详细介绍了java模拟实现银行ATM机操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 如何有效管理JVM中的垃圾?

    如何有效管理JVM中的垃圾?

    今天给大家带来的是关于Java虚拟机的相关知识,文章围绕着如何有效管理JVM中的垃圾展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java 实现字符串SHA1加密方法

    Java 实现字符串SHA1加密方法

    这篇文章主要介绍了Java 实现字符串SHA1加密方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java的Spring框架下RMI与quartz的调用方法

    Java的Spring框架下RMI与quartz的调用方法

    这篇文章主要介绍了Java的Spring框架下RMI与quartz的调用方法,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-11-11

最新评论