弹簧MVC中拦截器和滤波器的区别

2022-08-31 07:15:49

我对目的有点困惑。FilterInterceptor

正如我从文档中了解到的那样,是在请求之间运行的。另一方面是在渲染视图之前运行,但在控制器渲染响应之后运行。InterceptorFilter

那么拦截器和过滤器之间的区别在哪里呢?postHandle()doFilter()

Spring MVC sheme在哪些用例中应该使用它的最佳实践是什么?在这张图片中,工作 s 和 s 在哪里?FilterInterceptor


答案 1

来自 的 javadocHandlerIntercepter

HandlerInterceptor基本上类似于 Servlet ,但与后者相比,它只是允许自定义预处理,可以选择禁止执行处理程序本身,以及自定义后处理。过滤器更强大,例如,它们允许交换在链中传递的请求和响应对象。请注意,过滤器是在 应用程序上下文中的 a 中配置的。Filterweb.xmlHandlerInterceptor

作为基本准则,与处理程序相关的细粒度预处理任务是实现的候选项,尤其是分解的常见处理程序代码和授权检查。另一方面,a 非常适合请求内容和视图内容处理,如多部分表单和 GZIP 压缩。这通常显示何时需要将筛选器映射到某些内容类型(例如图像)或所有请求。HandlerInterceptorFilter

话虽如此:

那么 和 之间的区别在哪里呢?Interceptor#postHandle()Filter#doFilter()

postHandle将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图中添加更多模型对象,但不能更改,因为它已经提交。HttpServletResponse

doFilter比 .您可以更改请求或响应并将其传递给链,甚至阻止请求处理。postHandle

此外,在 和 方法中,您可以访问处理请求的 。因此,您可以根据处理程序本身添加预处理/后处理逻辑。例如,可以为具有一些批注的处理程序方法添加逻辑。preHandlepostHandleHandlerMethod

在哪些用例中应该使用它的最佳实践是什么?

正如文档所说,与处理程序相关的细粒度预处理任务是实现的候选对象,尤其是分解的常见处理程序代码和授权检查。另一方面,a 非常适合请求内容和视图内容处理,如多部分表单和 GZIP 压缩。这通常显示何时需要将筛选器映射到某些内容类型(例如图像)或所有请求。HandlerInterceptorFilter


答案 2

过滤器: - 顾名思义,过滤器是由 servlet 容器为每个传入的 HTTP 请求和每个 HTTP 响应执行的 Java 类。这种方式可以在HTTP传入请求到达资源之前对其进行管理,例如JSP页面,servlet或简单的静态页面;同样,可以在资源执行后管理 HTTP 出站响应。

Interceptor: - Spring Interceptors类似于Servlet Filters,但它们在Spring上下文中起作用,因此可以管理HTTP请求和响应,但它们可以实现更复杂的行为,因为它们可以访问所有Spring上下文。


推荐