我对Filter和Interceptor的用途有点困惑。
根据我在文档中的理解,Interceptor是在请求之间运行的。另一方面,Filter在渲染视图之前运行,但在控制器渲染响应之后运行。
那么拦截器中的postHandle()和过滤器中的doFilter()的区别在哪里呢?

应该在哪些用例中使用它的最佳实践是什么?在这张图片中,Filters和Interceptors在哪里工作?
发布于 2016-03-08 07:55:34
来自HandlerIntercepter的javadoc
Servlet HandlerInterceptor基本上类似于Servlet Filter,但与后者不同的是,它只允许自定义预处理,并允许禁止执行处理程序本身和自定义后处理。过滤器更强大,例如,它们允许交换传递到链上的请求和响应对象。请注意,过滤器是在应用程序上下文中的HandlerInterceptor web.xml中配置的。
作为基本指导原则,与处理程序相关的细粒度预处理任务是HandlerInterceptor实现的候选任务,尤其是分解出来的通用处理程序代码和授权检查。另一方面,Filter非常适合请求内容和视图内容的处理,比如多部分表单和GZIP压缩。这通常会显示需要将过滤器映射到特定内容类型(例如图像)或所有请求的时间。
如上所述:
那么
Interceptor#postHandle()和Filter#doFilter()的区别在哪里呢?
postHandle将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图中添加更多的模型对象,但您不能更改HttpServletResponse,因为它已经提交了。
与postHandle相比,doFilter的功能要多得多。您可以更改请求或响应,并将其传递到链,甚至阻塞请求处理。
此外,在preHandle和postHandle方法中,您可以访问处理请求的HandlerMethod。因此,您可以根据处理程序本身添加预处理/后处理逻辑。例如,您可以为具有一些注释的处理程序方法添加逻辑。
在哪些用例中应该使用它的最佳实践是什么?
正如文档所说,与处理程序相关的细粒度预处理任务是HandlerInterceptor实现的候选任务,特别是分解出来的通用处理程序代码和授权检查。另一方面,Filter非常适合请求内容和视图内容的处理,比如多部分表单和GZIP压缩。这通常会显示需要将过滤器映射到特定内容类型(例如图像)或所有请求的时间。
发布于 2018-12-21 14:16:35
过滤器:顾名思义,过滤器是一个由servlet容器为每个传入的HTTP请求和每个HTTP响应执行的Java类。通过这种方式,可以在HTTP传入请求到达资源(如JSP页面、servlet或简单的静态页面)之前对其进行管理;以同样的方式,可以在资源执行之后管理HTTP出站响应。
Spring拦截器:Spring拦截器类似于Servlet过滤器,但它们工作在Spring上下文中,因此可以强大地管理HTTP和Response,但它们可以实现更复杂的行为,因为它们可以访问所有Spring上下文。
发布于 2016-12-02 21:34:38
servlet为您提供了比筛选器更细粒度的控制,因为您可以访问实际的目标“处理程序”-这意味着您执行的任何操作都可以根据请求的实际操作而变化(而HandlerInterceptor筛选器通常应用于所有请求-只能考虑每个请求的参数)。处理程序拦截器还提供了3种不同的方法,以便您可以在处理程序完成之后但在视图呈现之前(甚至可以完全绕过视图呈现),或在呈现视图本身之后调用处理程序之前应用行为。此外,您还可以为不同的处理程序组设置不同的拦截器-拦截器在处理程序映射上配置,并且可能有多个处理程序映射。
因此,如果你需要做一些完全通用的事情(例如记录所有请求),那么过滤器就足够了-但是如果行为依赖于目标处理程序,或者你想在请求处理和视图呈现之间做一些事情,那么HandlerInterceptor就提供了这种灵活性。
https://stackoverflow.com/questions/35856454
复制相似问题