回答
过滤器和拦截器是我们 Java Web 开发中常用的两个功能,虽然他们的用途相似,都是用于对请求进行预处理和后置垂类的,但是他们还是存在如下 5 个不同之处:
- 实现原理不同
过滤器基于Java Servlet API实现,需实现javax.servlet.Filter
接口,并由Servlet容器管理;而拦截器是Spring框架提供的,通常通过实现HandlerInterceptor
接口,依赖于Spring上下文。
- 使用范围不同
过滤器适用于整个 Web 应用,能够处理所有 HTTP 请求,常用于全局性功能;拦截器主要用于 Spring MVC,针对特定控制器请求,适合处理业务逻辑相关的操作。
- 触发时机不同
过滤器在请求到达 Servlet 之前和响应返回之前触发,适用于预处理和后处理;拦截器在控制器方法执行前后触发,更专注于控制器逻辑的处理。
- 执行顺序不同
过滤器的执行顺序由 web.xml
配置或Spring Boot设置决定,多个过滤器按定义顺序依次执行;拦截器的执行顺序通过WebMvcConfigurer
中的addInterceptors
方法设置,灵活度更高。
- 控制执行顺序方式不同
过滤器的执行顺序通过配置文件或注解静态定义,顺序一旦设定后无法动态改变;而拦截器的执行顺序可以在运行时动态调整,提供了更大的灵活性。