SpringAOP如何修改請求參數(shù)列表
SpringAOP修改請求參數(shù)列表
如題,今天遇到了一個問題,要批量在前端請求之后修改其中的一個參數(shù)值。
我使用SpringAop攔截請求去修改參數(shù)值,因為Spring Aop是無法直接根據(jù)參數(shù)名獲取參數(shù)的,所以使用MethodSignature首先獲取當(dāng)前方法的參數(shù)列表,找到對應(yīng)參數(shù)的下標(biāo),然后根據(jù)下標(biāo)獲取當(dāng)前參數(shù)對應(yīng)的值。
代碼如下:
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];//找到對應(yīng)的值
...
}
return pjp.proceed(args);//修改參數(shù)值
}
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獲取參數(shù)名參數(shù)值
有時候我們在用Spring Aop面向切面編程,需要獲取連接點(JoinPoint)方法參數(shù)名、參數(shù)值。
環(huán)境:
- 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 {
/**
* 環(huán)繞通知
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around(value = "execution(* com.example.aopdemo..*(..)))")
public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.debug("執(zhí)行前:");
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(); //執(zhí)行連接點方法,object:方法返回值
log.debug("執(zhí)行后:");
return object;
}
/**
* 獲取參數(shù)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;
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot中如何使用Convert接口實現(xiàn)類型轉(zhuǎn)換器
這篇文章主要介紹了Spring Boot中使用Convert接口實現(xiàn)類型轉(zhuǎn)換器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Redis緩存,泛型集合與json字符串的相互轉(zhuǎn)換實例
這篇文章主要介紹了Redis緩存,泛型集合與json字符串的相互轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
關(guān)于kafka-consumer-offset位移問題
這篇文章主要介紹了關(guān)于kafka-consumer-offset位移問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
轉(zhuǎn)發(fā)和重定向是JavaWeb中常用的兩種頁面跳轉(zhuǎn)方式,它們在實現(xiàn)上有一些區(qū)別,本文主要介紹了JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2023-10-10

