Resultful API的拦截(切片Aspect)

本文详细介绍了如何在SpringBoot项目中使用Aspect切片进行方法拦截,并演示了切面获取参数、耗时监控以及异常处理的顺序。重点讲解了Filter、Interceptor和Aspect的协作及异常传递路径。
摘要由CSDN通过智能技术生成

一、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
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值