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


相关文章
|
3月前
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
194 4
如何在SpringBoot项目中使用过滤器和拦截器
|
7月前
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
84 0
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
265 0
|
1月前
|
存储 前端开发 JavaScript
|
1月前
|
存储 Java API
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
32 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
4月前
|
存储 Java API
SpringBoot + MinIO 实现文件切片极速上传技术
【8月更文挑战第19天】在现代互联网应用中,文件上传是一个常见且重要的功能。然而,随着文件体积的增大,传统的文件上传方式往往面临效率低下、耗时过长等问题。为了提升大文件上传的速度和效率,我们可以采用文件切片上传技术,并结合SpringBoot和MinIO来实现这一功能。
254 0
|
6月前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
482 6
|
6月前
|
Java API 数据安全/隐私保护
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
88 6
|
5月前
|
安全 Java Spring
Spring Boot中的自定义过滤器
Spring Boot中的自定义过滤器