SpringBoot实现过滤器、拦截器与切片(二)

简介: SpringBoot实现过滤器、拦截器与切片

切片Aspect


切片概述


相比过滤器,拦截器能够知道用户发出的请求最终被哪个控制器处理,但是拦截器还有一个明显的不足,即不能够获取request的参数以及控制器处理之后的response。所以就有了切片的用武之地了。


切片实现


切片的实现需要注意@Aspect,@Component以及@Around这三个注解的使用,详细查看官方文档:

docs.spring.io/spring/docs/5.0.12.RELEASE/spring-framework-reference/core.html#aop
@Aspect
@Component
public class TimeAspect {
    private static final Logger LOG = LoggerFactory.getLogger(TimeAspect.class);
    @Around("execution(* me.ifight.controller.*.*(..))")
    public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        LOG.info("切片开始。。。");
        long startTime = System.currentTimeMillis();
        // 获取请求入参
        Object[] args = proceedingJoinPoint.getArgs();
        Arrays.stream(args).forEach(arg -> LOG.info("arg is {}", arg));
        // 获取相应
        Object response = proceedingJoinPoint.proceed();
        long endTime = System.currentTimeMillis();
        LOG.info("请求:{}, 耗时{}ms", proceedingJoinPoint.getSignature(), (endTime - startTime));
        LOG.info("切片结束。。。");
        return null;
    }
}


过滤器、拦截器以及切片的调用顺序


如下图,展示了三者的调用顺序Filter->Intercepto->Aspect->Controller。相反的是,当Controller抛出的异常的处理顺序则是从内到外的。因此我们总是定义一个注解@ControllerAdvice去统一处理控制器抛出的异常。如果一旦异常被@ControllerAdvice处理了,则调用拦截器的afterCompletion方法的参数Exception ex就为空了。d8a7de30080c67e87d5a73409b64847e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg


实际执行的调用栈也说明了这一点:


3ab04f27824e38d9d0e087637288b5da_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg


而对于过滤器和拦截器详细的调用顺序如下图:


feb0a466ad5eb9adbee206ca15a629f6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg


过滤器和拦截器的区别


最后有必要再说说过滤器和拦截器二者之间的区别:除此之外,相比过滤器,拦截器能够“看到”用户的请求具体是被Spring框架的哪个控制器所处理。


参考


blog.csdn.net/xiaodanjava/article/details/32125687


相关文章
|
2月前
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
37 0
|
5月前
|
Java 数据库
SpringBoot中如何在过滤器中取get的参数值
SpringBoot中如何在过滤器中取get的参数值
72 0
|
5天前
|
SQL 前端开发 Java
SpringBoot 拦截器 统一结果返回 统一异常处理
SpringBoot 拦截器 统一结果返回 统一异常处理
9 0
|
2月前
|
存储 前端开发 NoSQL
【二十一】springboot整合过滤器实战
【二十一】springboot整合过滤器实战
18 0
|
8月前
|
JSON 安全 Java
Spring Boot中的安全过滤器及使用方法
Spring Boot中的安全过滤器及使用方法
|
5月前
|
前端开发 JavaScript Java
Spring Boot中Spring MVC的基本配置讲解与实战(包括静态资源配置,拦截器配置,文件上传配置及实战 附源码)
Spring Boot中Spring MVC的基本配置讲解与实战(包括静态资源配置,拦截器配置,文件上传配置及实战 附源码)
55 1
|
5月前
|
存储 Java
SpringBoot中过滤器如何设置执行顺序
SpringBoot中过滤器如何设置执行顺序
136 0
|
5月前
|
Java
SpringBoot中如何在过滤器中取post的参数值
SpringBoot中如何在过滤器中取post的参数值
99 0
|
5月前
|
存储 Java Maven
springboot项目中使用shiro 自定义过滤器和token的方式
springboot项目中使用shiro 自定义过滤器和token的方式
44 1
|
6月前
|
Java 数据安全/隐私保护
Springboot过滤器中注入Bean
Springboot过滤器中注入Bean
74 1