溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式

發(fā)布時(shí)間:2021-09-13 07:35:01 來源:億速云 閱讀:132 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式”吧!

目錄
  • SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)

    • aspect:第一種方式

    • aspect:第二種方式

  • SpringBoot @Aspect注解詳情

    • 1、添加maven依賴注解

    • 2、添加AOP類

    • 3、設(shè)置切面點(diǎn)

    • 4、配置前置通知

    • 5、配置后置返回通知

    • 6、后置異常通知

    • 7、后置最終通知

    • 8、環(huán)繞通知

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)

為什么要用aspect, 使用aspect 可以使記錄日志的功能面向切面,這樣可以降低代碼的耦合性。提供了兩種方式對(duì)輸入輸出的數(shù)據(jù)進(jìn)行打日志,如下:

aspect:第一種方式

@Before 和 @AfterReturning 來對(duì) controller 進(jìn)行切面。

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式

輸出數(shù)據(jù):

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式

aspect:第二種方式

@Around 來對(duì)controller 進(jìn)行切面。

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式

輸出數(shù)據(jù):

SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式

兩種方法都是能夠?qū)φ埱髷?shù)據(jù)做日志監(jiān)控。

第一種方式和第二種方式有一些不同,第二種方式使用的是@Around 環(huán)繞的方式去做的處理,joinPoint.proceed()返回?cái)?shù)據(jù)需要等方法執(zhí)行完才能執(zhí)行下面的代碼,這種是阻塞式的請求,所以個(gè)人建議還是采用第一種方法比較合適。

SpringBoot @Aspect注解詳情

1、添加maven依賴注解

<!--springBoot的aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2、添加AOP類

@Component
@Aspect
public class JournalServiceAspect {
}

3、設(shè)置切面點(diǎn)

/**切面點(diǎn)*/
    private final String POINT_CUT = "execution(* com.xx.xx..*(..))";
    @Pointcut(POINT_CUT)
    private void pointcut(){}

4、配置前置通知

/** 
 * 前置通知,方法調(diào)用前被調(diào)用 
 * @param joinPoint 
 */  
@Before(value = POINT_CUT)
public void before(JoinPoint joinPoint){
    logger.info("前置通知");
    //獲取目標(biāo)方法的參數(shù)信息  
    Object[] obj = joinPoint.getArgs();  
    //AOP代理類的信息  
    joinPoint.getThis();  
    //代理的目標(biāo)對(duì)象  
    joinPoint.getTarget();  
    //用的最多 通知的簽名  
    Signature signature = joinPoint.getSignature();  
    //代理的是哪一個(gè)方法  
    logger.info("代理的是哪一個(gè)方法"+signature.getName());  
    //AOP代理類的名字  
    logger.info("AOP代理類的名字"+signature.getDeclaringTypeName());  
    //AOP代理類的類(class)信息  
    signature.getDeclaringType();  
    //獲取RequestAttributes  
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();  
    //從獲取RequestAttributes中獲取HttpServletRequest的信息  
    HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);  
    //如果要獲取Session信息的話,可以這樣寫:  
    //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION);  
    //獲取請求參數(shù)
    Enumeration<String> enumeration = request.getParameterNames();  
    Map<String,String> parameterMap = Maps.newHashMap();  
    while (enumeration.hasMoreElements()){  
        String parameter = enumeration.nextElement();  
        parameterMap.put(parameter,request.getParameter(parameter));  
    }  
    String str = JSON.toJSONString(parameterMap);  
    if(obj.length > 0) {  
        logger.info("請求的參數(shù)信息為:"+str);
    }  
}

**注意:這里用到了JoinPoint和RequestContextHolder。

1)、通過JoinPoint可以獲得通知的簽名信息,如目標(biāo)方法名、目標(biāo)方法參數(shù)信息等。

2)、通過RequestContextHolder來獲取請求信息,Session信息。**

5、配置后置返回通知

/** 
 * 后置返回通知 
 * 這里需要注意的是: 
 *      如果參數(shù)中的第一個(gè)參數(shù)為JoinPoint,則第二個(gè)參數(shù)為返回值的信息 
 *      如果參數(shù)中的第一個(gè)參數(shù)不為JoinPoint,則第一個(gè)參數(shù)為returning中對(duì)應(yīng)的參數(shù) 
 * returning:限定了只有目標(biāo)方法返回值與通知方法相應(yīng)參數(shù)類型時(shí)才能執(zhí)行后置返回通知,否則不執(zhí)行,
 *            對(duì)于returning對(duì)應(yīng)的通知方法參數(shù)為Object類型將匹配任何目標(biāo)返回值 
 * @param joinPoint 
 * @param keys 
 */  
@AfterReturning(value = POINT_CUT,returning = "keys")  
public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){  
    logger.info("第一個(gè)后置返回通知的返回值:"+keys);  
}  
@AfterReturning(value = POINT_CUT,returning = "keys",argNames = "keys")  
public void doAfterReturningAdvice2(String keys){  
    logger.info("第二個(gè)后置返回通知的返回值:"+keys);  
}

6、后置異常通知

/** 
 * 后置異常通知 
 *  定義一個(gè)名字,該名字用于匹配通知實(shí)現(xiàn)方法的一個(gè)參數(shù)名,當(dāng)目標(biāo)方法拋出異常返回后,將把目標(biāo)方法拋出的異常傳給通知方法; 
 *  throwing:限定了只有目標(biāo)方法拋出的異常與通知方法相應(yīng)參數(shù)異常類型時(shí)才能執(zhí)行后置異常通知,否則不執(zhí)行, 
 *            對(duì)于throwing對(duì)應(yīng)的通知方法參數(shù)為Throwable類型將匹配任何異常。 
 * @param joinPoint 
 * @param exception 
 */  
@AfterThrowing(value = POINT_CUT,throwing = "exception")  
public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){  
    //目標(biāo)方法名:  
    logger.info(joinPoint.getSignature().getName());  
    if(exception instanceof NullPointerException){  
        logger.info("發(fā)生了空指針異常!!!!!");  
    }  
}

7、后置最終通知

/** 
 * 后置最終通知(目標(biāo)方法只要執(zhí)行完了就會(huì)執(zhí)行后置通知方法) 
 * @param joinPoint 
 */  
@After(value = POINT_CUT)  
public void doAfterAdvice(JoinPoint joinPoint){ 
    logger.info("后置最終通知執(zhí)行了!!!!");  
}

8、環(huán)繞通知

/** 
 * 環(huán)繞通知: 
 *   環(huán)繞通知非常強(qiáng)大,可以決定目標(biāo)方法是否執(zhí)行,什么時(shí)候執(zhí)行,執(zhí)行時(shí)是否需要替換方法參數(shù),執(zhí)行完畢是否需要替換返回值。 
 *   環(huán)繞通知第一個(gè)參數(shù)必須是org.aspectj.lang.ProceedingJoinPoint類型 
 */  
@Around(value = POINT_CUT)  
public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){  
    logger.info("環(huán)繞通知的目標(biāo)方法名:"+proceedingJoinPoint.getSignature().getName());  
    try {  
        Object obj = proceedingJoinPoint.proceed();  
        return obj;  
    } catch (Throwable throwable) {  
        throwable.printStackTrace();  
    }  
    return null;  
}

感謝各位的閱讀,以上就是“SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)的方式這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI