今天在写完公司的需求后梳理代码时发现使用了拦截器,下意识地发散性的思考了一下过滤器与拦截器的区别,简单总结整理一下。
- 归属规范
- 过滤器是JavaWeb Servlet规范里面的 ,通过实现
javax.servlet.Filter
接口实现。 - 拦截器是spring框架里面的。通过实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类实现。拦截器依赖于Spring框架,必须在Spring容器中注册为Bean,才能生效。 - 作用范围及触发时机
- 过滤器处理所有请求,在请求进入 Servlet 容器之前触发执行。
- 拦截器只在请求进入Controller前后进行拦截,默认不处理静态资源。
- 实现机制
- 过滤器基于基于函数回调实现,通过
FilterChain
传递请求,链式调用。 - 拦截器基于反射和动态代理实现,通过拦截器链(
HandlerExecutionChain
)执行。
- 适用场景
- 过滤器适用的场景:全局字符编码设置、跨域请求处理、压缩响应内容等。
- 拦截器适用的场景:日志记录、权限校验、接口监控、安全验证等。
拦截器和过滤器的区别在于它们的作用层面不同。
- 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,例如设置编码和字符集、请求头、状态码等。
- 拦截器则更加侧重于对控制器进行前置或后置处理,在请求到达控制器之前或之后进行特定的操作,例如打印日志、权限验证等。
Filter、Servlet、Interceptor、Controller的执行顺序:
