SpringBoot 过滤器和拦截器---实现全局接口日志输出
SpringBoot 过滤器和拦截器---实现全局接口日志输出
首先,看一张图:
Tomcat收到请求之后,会先通过过滤器 Filter,该过滤器属于 Java Http 框架(过滤器采用接口回调的方式来运行);然后请求被发送的 Servlet,SpringBoot收到请求之后,调用拦截器 Interceptor(使用了反射机制实现),最后请求才会被发送到Controller。
一、过滤器
过滤器是容器层面的,请求到达过滤器之后,我们可以使用包装器对请求进行包装,以供后续使用。
过滤器是基于接口回调的方式实现的,我们可以在 doFilter 函数中实现一些特定功能。
该接口的示例代码如下:
Filter 的示例实现如下:
上述代码中,利用接口传入的 FilterChain 对请求对象和响应对象进行了包装,方便后续使用。例如在到达拦截器之后,我们可以将 ServletRequest case 为我们包装的对象。
接下来,忘掉上面的例子,我们重新开始,有个需求:需要在拦截器中对 RequestBody 进行二次读取,以及需要在拦截器中读取 ResponseBody。
这里有个很隐蔽的点,就是 ServletRequest 中的输入流只能读一次(是直接从 tcp 流中读取的)。因此我们要对 ServletRequest 和 ServletResponse 进行包装。
首先,我们定义两个流和两个包装器:
- CachingServletInputStream: 对 ServletInputStream 输入流进行了包装,用于缓存 RequestBody
- CachingServletOutputStream: 对 ServletOutputStream 输出流进行了包装,用来缓存 ResponseBody
- CachingRequestWrapper: 对 HttpServletRequest 进行了包装,用来缓存输入流
- CachingResponseWrapper: 对 HttpServletResponse 进行了包装,用来缓存输出流
- LogFilter: 定义过滤器,使用上面的包装器
现在在过滤器层面,我们已经对 Request 和 Response 进行了包装,将它们包装成了 CachingRequestWrapper 和 CachingResponseWrapper 对象。
二、拦截器
拦截器在 SpringBoot 声明周期内,通过反射的方式来执行
拦截器 HandlerInterceptor 接口示例如下:
- preHandle:在 Filter 之后,Controller 之前调用
- postHandle:在 Controller 接口返回之后,到达 Filter 之前调用
- afterCompletion:在请求完成之后调用
下面是实现 HandlerInterceptor 的代码:
上述代码中我们自动注入了一个专门的 ControllerLogger 接口,该接口代码如下:
通过实现该接口,并且将其注入为 SpringBoot 组建,可以实现自定义日志输出。
配置拦截器
我们实现 WebMvcConfigurer 接口来对拦截器进行配置,代码如下:
结束。
__EOF__

本文链接:https://www.cnblogs.com/zolmk/p/16586276.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?