SpringAOP怎么修改请求参数列表

其他教程   发布日期:2023年08月03日   浏览次数:418

这篇“SpringAOP怎么修改请求参数列表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringAOP怎么修改请求参数列表”文章吧。

SpringAOP修改请求参数列表

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

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

代码如下:

  1. private final String execution = "execution(* com.zxy.test.degitaltool.tree.controller.TestController.*(..))";
  2. /**
  3. * @param pjp
  4. * @return
  5. * @throws Throwable
  6. */
  7. @Around(execution)
  8. public Object before(ProceedingJoinPoint pjp) throws Throwable {
  9. Method method = ((MethodSignature) pjp.getSignature()).getMethod();
  10. Parameter[] parameters = method.getParameters();
  11. int keyIndex = getKeyIndex2(parameters, "treeId");
  12. Object[] args = pjp.getArgs();
  13. if (keyIndex != -1) {
  14. String value = args[keyIndex];//找到对应的值
  15. ...
  16. }
  17. return pjp.proceed(args);//修改参数值
  18. }
  19. private int getKeyIndex2(Parameter[] parameters, String key) {
  20. for (int i = 0; i < parameters.length; i++) {
  21. if (Objects.equals(parameters[i].getName(), key)) {
  22. return i;
  23. }
  24. }
  25. return -1;
  26. }

SpringAOP获取参数名参数值

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

环境:

  • Mac OSX

  • Intellij IDEA

  • Spring Boot 2x

  • Jdk 1.8x

Code:

  1. package com.example.aopdemo.aop;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.reflect.CodeSignature;
  7. import org.springframework.stereotype.Component;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * DemoAop
  12. * Create by Gray(Ganguocai@outlook.com)
  13. */
  14. @Aspect
  15. @Component
  16. @Slf4j
  17. public class DemoAop {
  18. /**
  19. * 环绕通知
  20. * @param proceedingJoinPoint
  21. * @return
  22. * @throws Throwable
  23. */
  24. @Around(value = "execution(* com.example.aopdemo..*(..)))")
  25. public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  26. log.debug("执行前:");
  27. Map<String, Object> params = getNameAndValue(proceedingJoinPoint);
  28. for (Map.Entry<String, Object> entry : params.entrySet()) {
  29. System.out.println("name: " + entry.getKey() + " value: " + entry.getValue());
  30. }
  31. Object object = proceedingJoinPoint.proceed(); //执行连接点方法,object:方法返回值
  32. log.debug("执行后:");
  33. return object;
  34. }
  35. /**
  36. * 获取参数Map集合
  37. * @param joinPoint
  38. * @return
  39. */
  40. Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
  41. Map<String, Object> param = new HashMap<>();
  42. Object[] paramValues = joinPoint.getArgs();
  43. String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
  44. for (int i = 0; i < paramNames.length; i++) {
  45. param.put(paramNames[i], paramValues[i]);
  46. }
  47. return param;
  48. }
  49. }

以上就是SpringAOP怎么修改请求参数列表的详细内容,更多关于SpringAOP怎么修改请求参数列表的资料请关注九品源码其它相关文章!