您好,登錄后才能下訂單哦!
這篇文章主要講解了“SpringBoot@Aspect 打印訪問請求和返回數據的方式”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot@Aspect 打印訪問請求和返回數據的方式”吧!
SpringBoot@Aspect 打印訪問請求和返回數據
aspect:第一種方式
aspect:第二種方式
SpringBoot @Aspect注解詳情
1、添加maven依賴注解
2、添加AOP類
3、設置切面點
4、配置前置通知
5、配置后置返回通知
6、后置異常通知
7、后置最終通知
8、環繞通知
為什么要用aspect, 使用aspect 可以使記錄日志的功能面向切面,這樣可以降低代碼的耦合性。提供了兩種方式對輸入輸出的數據進行打日志,如下:
@Before 和 @AfterReturning 來對 controller 進行切面。
輸出數據:
@Around 來對controller 進行切面。
輸出數據:
兩種方法都是能夠對請求數據做日志監控。
第一種方式和第二種方式有一些不同,第二種方式使用的是@Around 環繞的方式去做的處理,joinPoint.proceed()返回數據需要等方法執行完才能執行下面的代碼,這種是阻塞式的請求,所以個人建議還是采用第一種方法比較合適。
<!--springBoot的aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
@Component @Aspect public class JournalServiceAspect { }
/**切面點*/ private final String POINT_CUT = "execution(* com.xx.xx..*(..))"; @Pointcut(POINT_CUT) private void pointcut(){}
/** * 前置通知,方法調用前被調用 * @param joinPoint */ @Before(value = POINT_CUT) public void before(JoinPoint joinPoint){ logger.info("前置通知"); //獲取目標方法的參數信息 Object[] obj = joinPoint.getArgs(); //AOP代理類的信息 joinPoint.getThis(); //代理的目標對象 joinPoint.getTarget(); //用的最多 通知的簽名 Signature signature = joinPoint.getSignature(); //代理的是哪一個方法 logger.info("代理的是哪一個方法"+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); //獲取請求參數 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("請求的參數信息為:"+str); } }
**注意:這里用到了JoinPoint和RequestContextHolder。
1)、通過JoinPoint可以獲得通知的簽名信息,如目標方法名、目標方法參數信息等。
2)、通過RequestContextHolder來獲取請求信息,Session信息。**
/** * 后置返回通知 * 這里需要注意的是: * 如果參數中的第一個參數為JoinPoint,則第二個參數為返回值的信息 * 如果參數中的第一個參數不為JoinPoint,則第一個參數為returning中對應的參數 * returning:限定了只有目標方法返回值與通知方法相應參數類型時才能執行后置返回通知,否則不執行, * 對于returning對應的通知方法參數為Object類型將匹配任何目標返回值 * @param joinPoint * @param keys */ @AfterReturning(value = POINT_CUT,returning = "keys") public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ logger.info("第一個后置返回通知的返回值:"+keys); } @AfterReturning(value = POINT_CUT,returning = "keys",argNames = "keys") public void doAfterReturningAdvice2(String keys){ logger.info("第二個后置返回通知的返回值:"+keys); }
/** * 后置異常通知 * 定義一個名字,該名字用于匹配通知實現方法的一個參數名,當目標方法拋出異常返回后,將把目標方法拋出的異常傳給通知方法; * throwing:限定了只有目標方法拋出的異常與通知方法相應參數異常類型時才能執行后置異常通知,否則不執行, * 對于throwing對應的通知方法參數為Throwable類型將匹配任何異常。 * @param joinPoint * @param exception */ @AfterThrowing(value = POINT_CUT,throwing = "exception") public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目標方法名: logger.info(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ logger.info("發生了空指針異常!!!!!"); } }
/** * 后置最終通知(目標方法只要執行完了就會執行后置通知方法) * @param joinPoint */ @After(value = POINT_CUT) public void doAfterAdvice(JoinPoint joinPoint){ logger.info("后置最終通知執行了!!!!"); }
/** * 環繞通知: * 環繞通知非常強大,可以決定目標方法是否執行,什么時候執行,執行時是否需要替換方法參數,執行完畢是否需要替換返回值。 * 環繞通知第一個參數必須是org.aspectj.lang.ProceedingJoinPoint類型 */ @Around(value = POINT_CUT) public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ logger.info("環繞通知的目標方法名:"+proceedingJoinPoint.getSignature().getName()); try { Object obj = proceedingJoinPoint.proceed(); return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; }
感謝各位的閱讀,以上就是“SpringBoot@Aspect 打印訪問請求和返回數據的方式”的內容了,經過本文的學習后,相信大家對SpringBoot@Aspect 打印訪問請求和返回數據的方式這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。