JavaEE進階知識學習-----SpringBootWeb進階-7-AOP處理請求知識

weixin_34194087發表於2018-02-28

AOP統一處理請求日誌

AOP是一種程式設計正規化,與程式語言無關,是一種程式設計思想。AOP:面向切面程式設計,OOP:物件導向程式設計,POP:程式導向程式設計,還有函數語言程式設計等等。

AOP例項-記錄每一個HTTP請求

1.新增依賴

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

2.編寫切面,切入點類

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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 HttpAspect {
    //使用log列印日誌
    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);

    @Pointcut("execution(public * com.study.springbootdemo.controller.UserController.*(..))")
    public void log(){}

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
        //記錄Http請求
        ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //記錄URL
        logger.info("url={}",request.getRequestURL());
        //記錄請求方法
        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("log()")
    public void doAfter(){
        logger.info("2222222222222222");
    }
}

說明:

  1. @Pointcut("execution(public * com.study.springbootdemo.controller.UserController.*(..))")是一個切入點,表示UserController類中的所有方法。
  2. @Aspect註解表示這是一個該類是一個切面類
  3. @Component註解表示將該類交於Spring來管理,
  4. @Before("log()")註解表示UserController類中的方法被訪問前執行的方法
  5. @After("log()")註解表示UserController類中的方法被訪問後要執行的方法

3.啟動程式,使用postman進行測試

3.1測試查詢使用者列表
10417188-29e4faffcd37dbe1..png
image
測試結果為:
10417188-12b2a2fd020c0241..png
image
3.2測試新增一個使用者
10417188-d7ea9d4e9d62623f..png
image
測試結果為:
10417188-5b3685e9ae0d659c..png
image

相關文章