目錄
- 一、Resultful API的攔截三種方式
- 二、切片(Aspect)的演示示例(springboot專案)
- 三、切片(Aspect)特點
- 四、Filter過濾器、Interceptor攔截器 、Aspect切面 起作用的順序
- 五、當控制層(即Controller層)的方法拋例外時,Filter過濾器、Interceptor攔截器 、Aspect切面 拋例外的順序
一、Resultful API的攔截三種方式
- 過濾器(Filter)
- 攔截器(Interceptor)
- 切片(Aspect)
二、切片(Aspect)的演示示例(springboot專案)
1、自定義一個名稱為TimeAspect的切片,代碼如下:
package com.xz.springsecuritydemo.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Date;
@Aspect//宣告切面
@Component//注入到容器
public class TimeAspect {
//什么時候起作用 使用注解,例如@Before()、 @After()、@AfterThrowing()、@AfterReturning()、@Around()
//在哪些方法上啟作用,在注解中使用運算式
/**
* execution 表示執行
* 第一個* 表示任何的回傳值
* com.xz.springsecuritydemo.modules.sys.controller.SysQueryController 要攔截的類
* .* 表示SysQueryController類中任何一個方法
* (..) 表示SysQueryController類中任何一個方法的任何一個引數
* ProceedingJoinPoint 引數表示當前攔截方法的資訊物件
*/
@Around("execution(* com.xz.springsecuritydemo.modules.sys.controller.SysQueryController.*(..))")
public Object handleConrtollerMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("time aspect start");
//獲取方法的引數
Object[] args = pjp.getArgs();
for (Object arg:args){
System.out.println("方法的引數:"+arg);
}
long startTime = new Date().getTime();
Object proceed = pjp.proceed();
System.out.println("aspect 耗時:"+(new Date().getTime()-startTime));
System.out.println("time aspect end");
return proceed;
}
}
2、自定義一個控制類,代碼如下:
@RestController//表示此Controller提供RestAPI
public class SysQueryController {
/**
* @RequestMapping 映射http請求url到java方法
* @RequestParam 映射請求引數到java方法的引數
*/
@RequestMapping(value = "/user1",method = RequestMethod.GET)
public void query1(@RequestParam String username){
System.out.println("query1====="+username);
}
}
3、測驗步驟
-
啟動專案,如下圖:

-
再用postman測驗工具發送請求,如下圖:

-
最后查看控制態輸出資訊,如下圖:
time aspect start 方法的引數:xz query1=====xz aspect 耗時:1 time aspect end
5、輸出第4步的內容表示自定義的切片Aspect攔截器成功,
三、切片(Aspect)特點
- 由上面的示例可知:切片(Aspect)獲取不到原始的http請求和回應的資訊,但是可以獲取到真正處理請求的方法的引數值
四、Filter過濾器、Interceptor攔截器 、Aspect切面 起作用的順序
- 先是Filter過濾器起作用
- 然后Interceptor攔截器起作用
- 然后Aspect切面起作用
- 最后進入Controller方法中
五、當控制層(即Controller層)的方法拋例外時,Filter過濾器、Interceptor攔截器 、Aspect切面 拋例外的順序
- 先是Aspect切面
- 如果使用@ControllerAdvice自定義例外,再進入這個處理例外類
- 然后Interceptor攔截器
- 然后Filter過濾器
- 如果都沒處理,最后到tomcat
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298101.html
標籤:其他
