springbootAOP定義切點(diǎn)獲取/修改請(qǐng)求參數(shù)方式
更新時(shí)間:2024年08月27日 08:38:06 作者:Yonu
這篇文章主要介紹了springbootAOP定義切點(diǎn)獲取/修改請(qǐng)求參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(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)(無(wú)論方法是否發(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屬性用于訪問(wèn)目標(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){ //獲取請(qǐng)求參數(shù) ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = Objects.requireNonNull(attributes).getRequest(); Map<String, String[]> parameterMap = request.getParameterMap(); //通過(guò)參數(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; } //獲取請(qǐng)求參數(shù) Map<String, Object> fieldsName = getFieldsName(joinPoint); Object ext1 = fieldsName.get("ext1"); //POST請(qǐng)求強(qiáng)轉(zhuǎn) SafetyAuditPageVo ext2 = (SafetyAuditPageVo) fieldsName.get("ext"); //修改請(qǐng)求參數(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è)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
Component和Configuration注解區(qū)別實(shí)例詳解
這篇文章主要為大家介紹了Component和Configuration注解區(qū)別實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11springboot?security驗(yàn)證碼的登錄實(shí)例
這篇文章主要介紹了springboot?security驗(yàn)證碼的登錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Java與Unix時(shí)間戳的相互轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Java與Unix時(shí)間戳的相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Spring Boot項(xiàng)目@RestController使用重定向redirect方式
這篇文章主要介紹了Spring Boot項(xiàng)目@RestController使用重定向redirect方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼
本文主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02