SpringAOP如何修改请求参数列表
作者: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; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。