SpringBoot 学习之常用 Filter / Advice 总结
Spring 源码系列
1、Spring 学习之扩展点总结之后置处理器(一)
2、Spring 学习之扩展点总结之后置处理器(二)
3、Spring 学习之扩展点总结之自定义事件(三)
4、Spring 学习之扩展点总结之内置事件(四)
5、Spring 学习之扩展点总结之@Import(五)
6、Spring 学习之AOP总结之基础介绍(六)
7、Spring 学习之AOP总结之实现代理(七)
8、SpringBoot 学习之自动配置基本原理(八)
9、SpringBoot 学习之启动原理(九)
10、ElasticSearch学习随笔之SpringBoot Starter 操作
11、图数据库 Neo4j 学习之SpringBoot整合
12、SpringBoot 学习之常用 Filter / Advice 总结
前言
前两天在开发一个需求时遇到这么一个问题,我需要对接口的返回体【Response Body】做一些处理,猛然间居然手足无措。想必这肯定要使用到的就是 Filter【过滤器】,用哪个过滤器呢?一般多用的就是继承 OncePerRequestFilter
、GenericFilter
或者是直接实现 Filter 接口等,不过这次不太一样,是要对 Response Body 进行处理,最终还是选择了 ResponseBodyAdvice
来实现。
此篇就针对常用的过滤器和针对如何对 Request 和 Response 进行处理进行简单的总结。
一、什么是 Filter?
Spring Boot 的 Filter 是在处理 HTTP请求和响应前后执行特定的操作。可以执行比如 身份验证、日志记录、请求转发以及对请求体和响应体做处理。
Spring Boot 中有很多的 Filter,是通过 过滤器链(Filter Chain)来调用,Filter 链是一系列 Filter 的集合,按照它们在配置中的顺序依次执行。每个 Filter 都可以在请求 Servlet 前执行一些任务,然后将请求传递给下一个 Filter 或 Servlet。
在 Spring Boot 中,通过 @WebFilter
或 FilterRegistrationBean
来注册 Filter。这些注解或配置允许我们制定 Filter 的顺序以及需要过滤 URL 模式。
二、常用 Filter 总结
名称 | 使用方法 | 适用情况 | 注意事项 |
---|---|---|---|
Filter | implements | 通过实现该接口,重写 doFilter 方法来编写自己的过滤器逻辑 | 加上 @Component 注解,重写 doFilter() 方法,特殊逻辑并调用Filter链 【chain.doFilter(request, response);】 |
GenericFilter | extends | 作为基本的通用 Filter 类,可用于执行特定的过滤逻辑 | 加上 @Component 注解,doFilter() 方法中实现特殊逻辑并调用Filter链 【chain.doFilter(request, response);】加入调用链 |
OncePerRequestFilter | extends | 确保 Filter 只在每个请求中执行一次,而不重复执行 | 加上 @Component 注解,重写 doFilterInternal() 方法,实现自己特殊逻辑之后,调用 【chain.doFilter(request, response);】加入调用链 |
RequestContextFilter | extends | 用于过滤请求体内容,允许开发者根据需要对请求体和响应体进行修改或处理 | 加上 @Component 注解,重写 doFilterInternal() 方法,进行特殊逻辑操作,调用【filterChain.doFilter(request, response);】加入调用链 |
CharacterEncodingFilter | extends | 设置请求和响应的字符编码,确保正确地处理请求体和响应体中的中文或特殊字符 | 加上 @Component 注解,重写 doFilterInternal() 方法,进行请求体字符编码进行过滤,调用【filterChain.doFilterInternal(request, response);】加入调用链或者调用父类 doFilterInternal() 方法 |
HttpFilter | extends | 处理 HTTP 请求体和响应体 | 继承自 GenericFilter,加上 @Component 注解,重写 doFilter() 方法,注意,有两个 doFilter() 方法,一个是 public void doFilter(),另一个是 protected void doFilter() 方法,public doFilter 方法是 Filter 接口规定的方法,它在请求到达时被容器调用,然后它内部会再调用 protected doFilter 方法,这个方法才是实际处理请求逻辑的地方 |
三、什么是 Advice?
在 SpringBoot 中,通知(Advice)是一种拦截器,用于在请求处理的不同阶段或响应进行全局的处理和定制化操作,允许开发者在请求处理的特定时刻介入对请求和响应做出修改或扩展。
这些通知类(Advice)可以在请求处理的不同阶段进行拦截和操作,例如处理请求、处理响应等。Spring 提供了一系列的通知类,如 ResponseBodyAdvice、RequestBodyAdvice、ControllerAdvice 等,用于不同的请求或响应处理场景。
三、常用 Advice 总结
名称 | 如何使用 | 适用情况 | 注意事项 |
---|---|---|---|
RequestBodyAdvice | implements | 在请求体到达控制器方法之前进行定制和处理 | 加上 @ControllerAdvice 注解,重写 supports()、beforeBodyRead()、afterBodyRead()、handleEmptyBody() 方法,在 beforeBodyRead() 和 afterBodyRead() 方法中正确处理请求体,确保修改后的请求体类型与原始类型兼容 |
ResponseBodyAdvice | implements | 全局性地对控制器方法返回的响应体进行定制和处理 | 加上 @ControllerAdvice 注解,重写 supports()、 beforeBodyWrite() 方法,supports() 方法用于指定需要进行处理的响应类型,beforeBodyWrite() 方法用于实际对响应体进行修改或处理,但需要确保修改后的响应体类型与原始类型兼容 |
@ExceptionHandler | 方法注解 | 全局异常处理 | 在异常处理类上加上 @ControllerAdvice 注解标注是全局处理类,在异常处理方法上加上 @ExceptionHandler 注解,指定 value 需要处理什么样的异常【@ExceptionHandler(value = ArithmeticException.class)】 |
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!