过滤器filter和拦截器interceptor的比较
之前看过一篇博客有这么一句话:
过滤器是取你所想,拦截器是拒你所不想
但其实两者都可以理解为起过滤的作用。
具体区别而言,总结有如下几点:
| 方面 | filter | interceptor |
|---|---|---|
| 实现原理 | 基于函数回调 | java反射,动态代理 |
| 是否依赖servlet | java原生,依赖servlet | spring框架所有,不依赖servlet |
| 作用范围 | 所有的url,可以配置 | 无法配置url,只是针对实现某接口的类的方法在其前后进行处理,这也正是动态代理的逻辑 |
| 是否可以自动注入context中的bean | 不能,但可以通过getBean方法获得 | 可以 |
| 如何选择 | 在纯Java的应用中尽量选择filter,减小第三方 | 在spring应用中官方推荐interceptor |
执行顺序
过滤器 -> 拦截器 -> aop -> 业务逻辑 -> 拦截器的post方法 -> filter的destroy
使用场景
-
日志记录:记录请求相关的日志,容易进行统计和监控。
-
权限检查:如登录检测 。
-
性能监控或者问题排查:拦截器可以在某个方法执行前后进行处理,通过拦截器可以将一个请求的调用链每个环节的时间打印出来进行问题排查,当然现在可以使用APM;
-
通用行为:获取一些全局需要的信息,例如通过token获得用户信息,将用户信息放在securityContext中,通过@ModelAttribure直接在controller中使用。
推荐阅读:
@ModelAttribute实践总结

本文详细比较了过滤器(filter)和拦截器(interceptor)的区别,包括实现原理、依赖性、作用范围、自动注入能力及执行顺序。并探讨了它们在日志记录、权限检查、性能监控和通用行为等场景下的应用。
461

被折叠的 条评论
为什么被折叠?



