1. 程式人生 > >Spring Boot:AOP統一處理HTTP請求

Spring Boot:AOP統一處理HTTP請求

版權宣告:博主原創/資料整理,轉載請註明出處!!

首先,AOP (Aspect Oriented Programming )指面向切面程式設計,通過預編譯方式或者執行時刻對目標物件動態地新增功能。

一、Spring Boot中新增AOP依賴

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

二、Spring Boot中AOP處理HTTP請求

  1. 專案下新建aspect包,aspect包下新建AspectTest類。AspectTest類上添加註解@Aspect和@Component。@Aspect讓Spring容器知道這是一個AOP類。@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註,並把這些類納入進spring容器中管理。
@Aspect
@Component
public class AspectTest {
}
  1. 使用靜態Logger方法列印日誌:宣告Logger方法,
    private static Logger logger = LoggerFactory.getLogger(AspectTest.class);

使用ALT+ENTER快捷鍵,自動匯入Logger包和LoggerFactory包,如下;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
  1. 我們希望在HTTP請求到具體的controller之前記錄下URL(請求路徑)、method(請求方式)、ip(IP地址)、class_method(請求的類方法)和args(請求的引數)。
  2. 使用註解@Pointcut,表示為AOP的切入點,指定要切入的位置(比如某個controller);使用@Before(“Jointpoint jointpoint”)做一些HTTP請求到具體的controller之前
    的操作,這裡JointPoint(連線點)表示程式執行過程中明確的點,一般是方法的呼叫;使用@After做一些HTTP請求到具體的controller之後的操作;使用@AfterReturning來獲取HTTP請求的結果。

三、附上程式碼,僅供參考。

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)])