过滤器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实践总结