Spring Boot:AOP統一處理HTTP請求
阿新 • • 發佈:2018-12-13
版權宣告:博主原創/資料整理,轉載請註明出處!!
首先,AOP (Aspect Oriented Programming )指面向切面程式設計,通過預編譯方式或者執行時刻對目標物件動態地新增功能。
一、Spring Boot中新增AOP依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
二、Spring Boot中AOP處理HTTP請求
- 專案下新建aspect包,aspect包下新建AspectTest類。AspectTest類上添加註解@Aspect和@Component。@Aspect讓Spring容器知道這是一個AOP類。@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註,並把這些類納入進spring容器中管理。
@Aspect
@Component
public class AspectTest {
}
- 使用靜態Logger方法列印日誌:宣告Logger方法,
private static Logger logger = LoggerFactory.getLogger(AspectTest.class);
使用ALT+ENTER
快捷鍵,自動匯入Logger包和LoggerFactory包,如下;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
- 我們希望在HTTP請求到具體的controller之前記錄下URL(請求路徑)、method(請求方式)、ip(IP地址)、class_method(請求的類方法)和args(請求的引數)。
- 使用註解@Pointcut,表示為AOP的切入點,指定要切入的位置(比如某個controller);使用@Before(“Jointpoint jointpoint”)做一些HTTP請求到具體的controller之前
三、附上程式碼,僅供參考。
package com.quanweitech.firststudy.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class AspectTest {
private static Logger logger = LoggerFactory.getLogger(AspectTest.class);
@Pointcut("execution(public * com.quanweitech.firststudy.controller.DepartmentInfoController.*(..))")
public void AOPTest() {
}
@Before("AOPTest()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//日誌列印:url
logger.info("url={}", request.getRequestURL()); //StringBuffer
//日誌列印:method
logger.info("method={}", request.getMethod());
//日誌列印:ip
logger.info("ip={}", request.getRemoteAddr());
//日誌列印:類方法
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
//日誌列印:引數
logger.info("args={}", joinPoint.getArgs());
}
@After("AOPTest()")
public void doAfter() {
logger.info("AOPTest() is ENDING!!!");
}
@AfterReturning(returning = "object", pointcut = "AOPTest()")
public void doAfterReturning(Object object) {
logger.info("response={}", object.toString());
}
}
測試:使用GET請求方式查詢id=18的資料,執行結果如下:
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doBefore(AspectTest.java:33)
- url=http://localhost:8087/springboot/dept/get/dept_info/18
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doBefore(AspectTest.java:36)
- method=GET
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doBefore(AspectTest.java:39)
- ip=0:0:0:0:0:0:0:1
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doBefore(AspectTest.java:42)
- class_method=com.quanweitech.firststudy.controller.DepartmentInfoController.departmentInfoFindOne
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doBefore(AspectTest.java:45)
- args=18
Hibernate: select department0_.id as id1_0_0_, department0_.create_time as create_t2_0_0_, department0_.update_time as update_t3_0_0_, department0_.business_id as business4_0_0_, department0_.delete_flag as delete_f5_0_0_, department0_.dept_code as dept_cod6_0_0_, department0_.dept_manager_list as dept_man7_0_0_, department0_.dept_name as dept_nam8_0_0_, department0_.ding_dept_id as ding_dep9_0_0_, department0_.parent_id as parent_10_0_0_, deptempinf1_.dept_id as dept_id4_1_1_, deptempinf1_.id as id1_1_1_, deptempinf1_.id as id1_1_2_, deptempinf1_.create_time as create_t2_1_2_, deptempinf1_.update_time as update_t3_1_2_, deptempinf1_.dept_id as dept_id4_1_2_, deptempinf1_.emp_id as emp_id5_1_2_ from department_info department0_ left outer join dept_emp_info deptempinf1_ on department0_.id=deptempinf1_.dept_id where department0_.id=?
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doAfter(AspectTest.java:51)
- AOPTest() is ENDING!!!
2018-12-13 14:20:39 INFO [http-nio-8087-exec-2] Caller+0 at com.quanweitech.firststudy.aspect.AspectTest.doAfterReturning(AspectTest.java:56)
- response=DepartmentInfo(dingDeptId=921, deptName=達摩院, deptCode=0921, parentId=921, deptManagerList=0921, businessId=921, deleteFlag=2, deptEmpInfoList=[DeptEmpInfo(empId=2, deptId=18), DeptEmpInfo(empId=7, deptId=18)])