日志放在拦截器还是过滤器

Filter

过滤器是 Web 应用程序组件,可以在请求到达 Servlet 之前对其进行访问,也可以在响应信息返回到客户端之前对其进行拦截。

Filter 的接口方法:

  • init:Serverlet 容器创建过滤器实例的时候调用
  • doFilter:拦截到达的请求,检查和处理Header的body的数据
  • destory:销毁过滤器,doFilter 中所有的方法超时之后,web 容器才会调用销毁

链式调用:

1673178899500-2b5822f9-a3af-4d6e-9ca8-cd9f2dde0037.png

Interceptor

拦截器是 AOP 的一种实现策略,用于在某个方法或宁段被访问前对它进行拦截,然后在其之前或之后加上某些操作。

Interceptor 的接口方法:preHandler、postHandler、afterCompletion

HandlerInterceptor 的接口方法:

  • preHandle:方法前置初始化操作,请求预处理,权限校验,返回Boolean
  • postHandle:方法后置处理,Controller 调用之后,DispatcherServelet视图渲染之前处理
  • afterCompletion:请求处理完成,包括 DispatcherServelet 渲染之后,主要是做资源清理工作

使用过滤器实现日志拦截

1673179130212-e9ec8593-ccdb-4b68-90ea-90d2d1b39823.png

1673179145658-ea87f9a5-4552-4a53-9366-41effcb4de13.png

需要加一个 SpringBoot 的注解定义扫描包的范围:

1673179191317-4fac893d-c16a-4ef4-a795-990444401e3a.png

使用拦截器实现日志拦截

注意下面的起始时间不是线程安全的:

1673179285541-72578f6e-577f-4ad9-bc4d-8ad004bd5019.png

1673179307189-c15d6503-e4ba-40aa-a8a1-8ccb7ad3ed25.png

1673179323655-6872b0f4-9d36-4bcf-8140-c20c458a9f61.png

1673179370263-1f3a82c0-c9a9-4ce5-b46c-4a692b1cdfd7.png

  1. order 越小,优先级越高
  2. 下面的实现方式是线程安全的。在Request 或者 ThreadLocal 里面保存变量

1673179519368-9a290ab6-abcb-4693-a838-487e94f691d2.png

1673179532119-40619d04-fb12-40e1-8738-4bc93d46ce95.png

选择

使用范围不同:Filter 只可以用于WEB程序,但是Interceptor可以用于非WEB项目

规范不同:Filter是Serverlet定义的,Interceptor是web定义的

使用的资源不同:Interceptor 是 Spring 管理的。Filter 不是。

优先去考虑使用拦截器,可以使用Spring所有的Bean。

posted on 2025-10-14 23:52  chuchengzhi  阅读(9)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客