springbootAOP定義切點(diǎn)獲取/修改請求參數(shù)方式
更新時(shí)間:2024年08月27日 08:38:06 作者:Yonu
這篇文章主要介紹了springbootAOP定義切點(diǎn)獲取/修改請求參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
AOP介紹
1.六種通知方式
- 環(huán)繞通知:在目標(biāo)方法執(zhí)行前和執(zhí)行后實(shí)施增強(qiáng),可用于日志記錄,事務(wù)處理等
- 前置通知:在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可用于權(quán)限管控等
- 后置返回通知:在目標(biāo)方法成功執(zhí)行后實(shí)施增強(qiáng),可用于關(guān)閉流,刪除臨時(shí)文件等
- 后置通知:在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)(無論方法是否發(fā)生異常都執(zhí)行),可用于釋放資源
- 異常通知:在目標(biāo)方法拋出異常時(shí)實(shí)施增強(qiáng),可用于處理異常,記錄日志等
- 引入通知:在目標(biāo)類中添加一些方法和屬性,用于修改目標(biāo)類
2.AspectJ相關(guān)注解
@Aspect:用于定義一個(gè)切面,注解在切面類上@Pointcut:用于定義切點(diǎn)表達(dá)式,在使用時(shí),需要定義一個(gè)切入點(diǎn)方法,該方法返回值為void,且方法體為空的普通方法@Before:用于定義前置通知,通常為其指定value屬性,該值可以是已有切入點(diǎn),也可以定義切點(diǎn)表達(dá)式@AfterReturning:用于定義后置返回通知,通常為其指定value屬性,該值可以是已有切入點(diǎn),也可以定義切點(diǎn)表達(dá)式@Around:用于定義環(huán)繞通知,通常為其指定value屬性,該值可以是已有切入點(diǎn),也可以定義切點(diǎn)表達(dá)式AfterThrowing:用于定義異常通知,通常為其指定value屬性,該值可以是已有切入點(diǎn),也可以定義切點(diǎn)表達(dá)式。另外還有一個(gè) throwing屬性用于訪問目標(biāo)方法拋出的異常,該屬性值與異常通知方法中同名的形參一致After:用于定義后置最終通知,通常為其指定value屬性,該值可以是已有切入點(diǎn),也可以定義切點(diǎn)表達(dá)式
定義切入點(diǎn)的兩種方式
1.注解
//定義注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SafetyHarness {
String defaultValue() default "";
}
//切入點(diǎn)
@Pointcut("@annotation(com.xx.xx.xx.web.annotation.SafetyHarness)")
public void efficacyParameters(){
}2.表達(dá)式
//該controller所有方法,可以直接指定
/*
execution():表達(dá)式主體
第一個(gè) * 表示返回類型,使用*表示所有類型,該 * 與包名之間有一個(gè)空格
第二個(gè) * 表示類名
第三個(gè) * 表示方法名
..表示任意參數(shù)
*/
@Pointcut("value = "execution(* com.xx.xx.xx.web.controller.*.* (..)))")
public void efficacyParameters(){
}常用兩種通知獲取參數(shù)
1.@Before
@Before("efficacyParameters()")
public void beforeEfficacyParameters(JoinPoint joinPoint){
//獲取請求參數(shù)
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
Map<String, String[]> parameterMap = request.getParameterMap();
//通過參數(shù)名獲取
Object ext1 = parameterMap.get("ext1");
Object ext2 = parameterMap.get("ext2");
}2.@Around
@Around("efficacyParameters()")
public T beforeEfficacyParameters(ProceedingJoinPoint joinPoint){
//接口返回結(jié)果,該結(jié)果可在業(yè)務(wù)前或業(yè)務(wù)后執(zhí)行
Object proceed = joinPoint.proceed();
Object[] obj = joinPoint.getArgs();
if (obj == null || obj.length == 0) {
return T;
}
//獲取請求參數(shù)
Map<String, Object> fieldsName = getFieldsName(joinPoint);
Object ext1 = fieldsName.get("ext1");
//POST請求強(qiáng)轉(zhuǎn)
SafetyAuditPageVo ext2 = (SafetyAuditPageVo) fieldsName.get("ext");
//修改請求參數(shù)
SafetyAuditPageVo vo = (SafetyAuditPageVo) obj[0];
vo.setXxxx("XXXXXX");
obj[0] = vo;
return joinPoint.proceed(obj);
}
private static Map<String, Object> getFieldsName(ProceedingJoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String[] parameterNames = pnd.getParameterNames(method);
Map<String, Object> paramMap = new HashMap<>(32);
for (int i = 0; i < parameterNames.length; i++) {
paramMap.put(parameterNames[i], args[i]);
}
return paramMap;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- SpringBoot 攔截器 (Interceptor)與切面 (AOP)示例、作用及適用場景分析
- AOP在SpringBoot項(xiàng)目中的使用場景解讀
- SpringBoot整合Jasypt使用自定義注解+AOP實(shí)現(xiàn)敏感字段加解密
- Springboot如何正確使用AOP問題
- springboot接口服務(wù),防刷、防止請求攻擊,AOP實(shí)現(xiàn)方式
- SpringBoot3利用AOP實(shí)現(xiàn)IP黑名單功能
- SpringBoot實(shí)現(xiàn)AOP切面的三種方式
- SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能
- SpringBoot AOP如何配置全局事務(wù)
- JAVA中Spring Boot的AOP切面編程是什么,如何使用?(實(shí)例代碼)
相關(guān)文章
詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法
這篇文章主要介紹了詳解J2EE開發(fā)的網(wǎng)站部署到阿里云服務(wù)器的方法,需要的朋友可以參考下2018-01-01
SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式
這篇文章主要介紹了SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解
這篇文章主要介紹了springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
java使用FastJson解析Json數(shù)據(jù)
本篇文章主要介紹了java使用FastJson解析Json數(shù)據(jù),fastjson 是一個(gè)性能極好的用 Java 語言實(shí)現(xiàn)的 JSON 解析器和生成器,有興趣的可以了解一下。2017-02-02
Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解
這篇文章主要介紹了Java Spring-IOC容器與Bean管理之基于注解的方式案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
springboot后端如何實(shí)現(xiàn)攜帶token登陸
這篇文章主要介紹了springboot后端如何實(shí)現(xiàn)攜帶token登陸,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Java形參和實(shí)參的實(shí)例之Integer類型與Int類型用法說明
這篇文章主要介紹了Java形參和實(shí)參的實(shí)例之Integer類型與Int類型用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

