- 拦截器是基于Java的反射机制,而过滤器是基于函数回调。
- 拦截器不依赖于Servlet容器,过滤器依赖于Servlet容器。
- 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有请求起作用。
- 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能。
- 在 action 的生命周期中,拦截器可以多次被调用,二过滤器只能在容器初始化时被调用一次。
- 拦截器可以获取 IOC 容器中的各个 bean,而过滤器不行,这点很重要,在拦截器中注入一个 service,可以调用业务逻辑。
Spring的拦截器与Servlet的 Filter 有相似之处,比如二者都是 AOP 编程思想的体现,都能实现权限检查、日志记录等。不同的是:
- 使用范围不同:Filter 是Servlet规范规定的,只能用于 Web 程序中。而拦截器既可以用于 Web 程序,也可以用于 Application、Swing 程序中。
- 规范不同:Filter 是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
- 使用的资源不同:同其他代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用 Spring 里的任何资源、对象,例如 Service 对象、数据源、事务管理等,通过 IOC 注入到拦截器即可,而 Filter 不能。
- 深度不同:Filter 只在 Servlet 前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用更具有弹性。所以在 Spring 构架的程序中,要优先使用拦截器。