1. 程式人生 > >spring boot通過自定義註解和AOP攔截指定的請求

spring boot通過自定義註解和AOP攔截指定的請求

本文主要通過切面類和自定註解的方式,攔截指定的介面(程式碼中已經作了詳細的說明)

目錄

一 準備工作

三 切面類

五 測試結果 

一 準備工作

1.1 新增依賴

通過spring boot建立好工程後,新增如下依賴,不然工程中無法使用切面的註解,就無法對制定的方法進行攔截

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

1.2 demo工程 

二 自定義註解

import java.lang.annotation.*;

/**
 * @Target 此註解的作用目標,括號裡METHOD的意思說明此註解只能加在方法上面
 * @Retention 註解的保留位置,括號裡RUNTIME的意思說明註解可以存在於執行時,可以用於反射
 * @Documented 說明該註解將包含在javadoc中
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MonitorRequest {
}

三 切面類


/**
 * 此類為一個切面類,主要作用就是對介面的請求進行攔截
 * 攔截的方式,只需要在指定介面方法上面加上@MonitorRequest註解即可
 *
 * @author guguoyu
 * @version 1.0
 * @since 2018/10/28
 */
@Aspect
@Component
public class RequestAspect {

    //使用org.slf4j.Logger,這是spring實現日誌的方法
    private final static Logger logger = LoggerFactory.getLogger(RequestAspect.class);

    /**
     * 表示在執行被@MonitorRequest註解修飾的方法之前 會執行doBefore()方法
     *
     * @param joinPoint 連線點,就是被攔截點
     */
    @Before(value = "@annotation(com.example.demo.annotation.MonitorRequest)")
    public void doBefore(JoinPoint joinPoint) {
        //獲取到請求的屬性
        ServletRequestAttributes attributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //獲取到請求物件
        HttpServletRequest request = attributes.getRequest();

        //URL:根據請求物件拿到訪問的地址
        logger.info("url=" + request.getRequestURL());
        //獲取請求的方法,是Get還是Post請求
        logger.info("method=" + request.getMethod());
        //ip:獲取到訪問
        logger.info("ip=" + request.getRemoteAddr());
        //獲取被攔截的類名和方法名
        logger.info("class=" + joinPoint.getSignature().getDeclaringTypeName() +
                "and method name=" + joinPoint.getSignature().getName());
        //引數
        logger.info("引數=" + joinPoint.getArgs().toString());

    }
}

四 Controller類

@RestController
public class TestController {

    /**
     * 添加了自定義註解@MonitorRequest
     * @return
     */
    @MonitorRequest
    @RequestMapping(value = "/test")
    public String test(){
        return "method be added @MonitorRequest";
    }

    /**
     * 沒有新增自定義註解
     * @return
     */
    @RequestMapping(value = "test2")
    public String test2(){
        return "method not be added @MonitorRequest";
    }
}

五 測試結果 

5.1 未被攔截的請求

5.2 已被攔截的請求