Resultful API的拦截(切片Aspect)
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Resultful API的拦截(切片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
以上是关于Resultful API的拦截(切片Aspect)的主要内容,如果未能解决你的问题,请参考以下文章