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;
    }
}

总结

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

相关文章

  • Java 单链表数据结构的增删改查教程

    Java 单链表数据结构的增删改查教程

    这篇文章主要介绍了Java 单链表数据结构的增删改查教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java使用Callable接口实现多线程的实例代码

    Java使用Callable接口实现多线程的实例代码

    这篇文章主要介绍了Java使用Callable接口实现多线程的实例代码,实现Callable和实现Runnable类似,但是功能更强大,具体表现在可以在任务结束后提供一个返回值,Runnable不行,call方法可以抛出异,Runnable的run方法不行,需要的朋友可以参考下
    2023-08-08
  • 关于SpringBoot自定义条件注解与自动配置

    关于SpringBoot自定义条件注解与自动配置

    这篇文章主要介绍了关于SpringBoot自定义条件注解与自动配置,Spring Boot的核心功能就是为整合第三方框架提供自动配置,而本文则带着大家实现了自己的自动配置和Starter,需要的朋友可以参考下
    2023-07-07
  • Java Filter过滤器的使用教程

    Java Filter过滤器的使用教程

    Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能
    2023-01-01
  • Jmeter如何添加循环控制器

    Jmeter如何添加循环控制器

    这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    在SpringBoot多模块项目中,如果遇到依赖存在但无法发现符号的问题,常见原因可能是pom.xml配置问题,例如,如果某个模块仅作为依赖而不是启动工程,不应在其pom中配置spring-boot-maven-plugin插件,因为这将影响jar包的生成方式
    2024-09-09
  • mybatis的MappedStatement线程安全探究

    mybatis的MappedStatement线程安全探究

    这篇文章主要为大家介绍了mybatis的MappedStatement线程安全示例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 从java反编译及字节码角度探索分析String拼接字符串效率

    从java反编译及字节码角度探索分析String拼接字符串效率

    这篇文章主要介绍了从java反编译及字节码角度探索分析String拼接字符串效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 实例讲解Java并发编程之闭锁

    实例讲解Java并发编程之闭锁

    这篇文章主要介绍了实例讲解Java并发编程之闭锁,闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过,需要的朋友可以参考下
    2015-04-04
  • 纯java代码实现抽奖系统

    纯java代码实现抽奖系统

    这篇文章主要为大家详细介绍了纯java代码实现抽奖系统,无连接数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论