SpringBoot 过滤器和拦截器的区别
SpringBoot 中的过滤器(Filter)和拦截器(Interceptor)都可以在请求处理的不同阶段执行特定的操作,但它们之间存在一些关键的区别:
1. 执行层级
- 过滤器(Filter):工作在 Servlet 层,是基于 Servlet 规范的一部分。它们可以对几乎所有的请求起作用,即使是那些不经过 Spring Dispatcher Servlet 的请求。
- 拦截器(Interceptor):工作在 Spring MVC 层,是 Spring 框架的一部分。它们只能对经过 Spring Dispatcher Servlet 的请求起作用,即只能处理控制器(Controller)的请求。
2. 功能范围
- 过滤器(Filter):通常用于处理通用的请求和响应转换,如日志记录、安全认证、请求和响应的修改等。
- 拦截器(Interceptor):通常用于处理特定的业务逻辑,如性能监控、事务管理、权限检查等。
3. 配置方式
- 过滤器(Filter):可以通过在配置类中注册
FilterRegistrationBean
或使用@WebFilter
注解来配置。 - 拦截器(Interceptor):需要在一个配置类中实现
WebMvcConfigurer
接口,并重写addInterceptors
方法来添加自定义拦截器。
4. 参数访问
- 过滤器(Filter):可以访问到原始的请求和响应对象(
HttpServletRequest
和HttpServletResponse
),但无法直接访问 Spring MVC 的控制器方法和参数。 - 拦截器(Interceptor):可以访问控制器方法的元数据,如方法签名、参数等,通过
preHandle
方法的Object handler
参数。
5. 执行顺序
- 过滤器(Filter):按照它们在过滤器链中的顺序执行。
- 拦截器(Interceptor):分为三个阶段执行:
preHandle
(请求处理之前)、postHandle
(请求处理之后、视图渲染之前)、afterCompletion
(请求处理完成后)。
结论
虽然过滤器和拦截器在某些方面有重叠的功能,但它们在执行层级、功能范围和配置方式上有明显的区别。选择使用哪个取决于您的具体需求和场景。在实际开发中,根据需要灵活使用过滤器和拦截器可以帮助您更好地控制请求处理流程和执行特定的操作。