在构建 Spring Boot 应用程序时,经常会遇到 "拦截器 (Interceptor) "和 "过滤器 (Filter) "这两个术语。两者都用于拦截应用程序中的请求和响应,但两者之间存在一些关键区别。本文将探讨 Spring 拦截器和过滤器之间的区别并比较它们的优缺点,以及它们如何影响 Spring Boot 应用程序的执行流程。
Spring 拦截器用于在控制器 (controller) 级别拦截请求和响应。它们在控制器方法调用之前和控制器方法返回之后执行。这意味着我们可以在请求或响应到达控制器之前或控制器处理之后对其进行修改。 拦截器通常用于
关于拦截器的具体实现参考《Spring MVC 拦截器 HandlerInterceptor 简介》
过滤器用于在 servlet 层拦截请求和响应。它们在请求到达 servlet 之前和响应生成之后执行。过滤器可用于修改请求或响应,或对请求或响应执行其他操作。 过滤器通常用于
过滤器使用 javax.servlet.Filter 接口实现。该接口定义了一个方法:
doFilter()
- 针对通过过滤器的每个请求和响应执行。使用该方法可以修改请求或响应,或对请求或响应执行其他操作。
Spring 拦截器和过滤器的主要区别在于它们的运行级别。拦截器在控制器层面运行,而过滤器在 servlet 层面运行。这意味着拦截器可以访问控制器并修改模型和视图,而过滤器不能访问控制器,只能修改请求和响应。 另一个区别是它们的执行顺序。拦截器在控制器方法之前和之后执行,而过滤器在 servlet 之前和之后执行。这意味着拦截器对请求和响应的控制更精细,而过滤器对请求和响应的控制更笼统。
| 区别 | 拦截器 | 控制器 | | --- | --- | --- | | 运行级别 | 控制器层面 | servlet 层面 | | 访问控制器 | 是 | 否 | | 执行顺序 | 在控制器方法之前/之后 | 在 Servlet 之前/之后 | | 定义在 | Spring 框架 | Servlet 规范 | | 实现接口 | HandlerInterceptor | javax.servlet.Filter |
Spring Boot 应用程序中的过滤器和拦截器的执行流程
总之,Spring 拦截器和过滤器都用于拦截网络应用程序中的请求和响应。拦截器在控制器级运行,而过滤器在 servlet 级运行。拦截器对请求和响应的控制更精细,而过滤器对请求和响应的控制更笼统。拦截器和过滤器都是定制和增强网络应用程序的有用工具,在选择在应用程序中使用哪种拦截器和过滤器时,了解它们之间的区别非常重要。
原文: https://bootcamptoprod.com/spring-interceptors-vs-filters-ultimate-comparison/