我对 Filter和 Interceptor的用途有点困惑。
Filter
Interceptor
我从文档中了解到,Interceptor是在请求之间运行的。另一方面,Filter在呈现视图之前运行,但在 Controller 呈现响应之后运行。
那么拦截器中的 postHandle()和过滤器中的 doFilter()有什么不同呢?
postHandle()
doFilter()
在哪些用例中应该使用它的最佳实践是什么? 在这张图片中工作的 Filter和 Interceptor?
来自 HandlerIntercepter的 Javadoc:
HandlerIntercepter
HandlerInterceptor基本上类似于 Servlet Filter,但是在 与后者相比,它只允许使用 选项禁止执行处理程序本身,并自定义 过滤器更加强大,例如,它们允许 传递的请求和响应对象交换 请注意,过滤器是在 web.xml中配置的,而 应用程序上下文中的 HandlerInterceptor。 作为基本原则,与细粒度处理程序相关的预处理任务 是 HandlerInterceptor实现的候选者,特别是 通用处理程序代码和授权检查 另一方面,Filter非常适合请求内容和视图 内容处理,如多部分表单和 GZIP 压缩 通常显示需要将过滤器映射到特定内容的时间 类型(例如图像) ,或对所有请求。
HandlerInterceptor基本上类似于 Servlet Filter,但是在 与后者相比,它只允许使用 选项禁止执行处理程序本身,并自定义 过滤器更加强大,例如,它们允许 传递的请求和响应对象交换 请注意,过滤器是在 web.xml中配置的,而 应用程序上下文中的 HandlerInterceptor。
HandlerInterceptor
web.xml
作为基本原则,与细粒度处理程序相关的预处理任务 是 HandlerInterceptor实现的候选者,特别是 通用处理程序代码和授权检查 另一方面,Filter非常适合请求内容和视图 内容处理,如多部分表单和 GZIP 压缩 通常显示需要将过滤器映射到特定内容的时间 类型(例如图像) ,或对所有请求。
话虽如此:
那么 Interceptor#postHandle()和 Filter#doFilter()?
Interceptor#postHandle()
Filter#doFilter()
将在处理程序方法调用之后但在呈现视图之前调用 postHandle。因此,您可以向视图添加更多的模型对象,但是您可以 没有更改 HttpServletResponse,因为它已经提交了。
postHandle
HttpServletResponse
doFilter比 postHandle多才多艺。您可以更改请求或响应,并将其传递给链,甚至阻止请求处理。
doFilter
另外,在 preHandle和 postHandle方法中,您可以访问处理请求的 HandlerMethod。因此,您可以根据处理程序本身添加预处理/后处理逻辑。例如,可以为具有某些注释的处理程序方法添加逻辑。
preHandle
HandlerMethod
在哪些用例中应该使用它的最佳实践是什么?
正如文档所说,细粒度处理程序相关的预处理任务是 HandlerInterceptor实现的候选者,特别是分解出的通用处理程序代码和授权检查。另一方面,Filter非常适合于请求内容和视图内容处理,如多部分表单和 GZIP 压缩。这通常表明当需要将过滤器映射到某些内容类型(例如图像)或所有请求时。
HandlerInterceptor 比过滤器提供更细粒度的控制,因为您可以访问实际的目标“处理程序”——这意味着您执行的任何操作都可以根据请求的实际执行情况而有所不同(而 servlet 过滤器通常应用于所有请求——只能考虑每个请求的参数)。处理程序拦截器还提供了3种不同的方法,这样您就可以在处理程序完成之后、视图呈现之前(您甚至可以完全绕过视图呈现)或视图本身呈现之后,在调用处理程序之前应用行为。此外,您可以为不同的处理程序组设置不同的拦截器——拦截器是在处理程序映射上配置的,并且可能存在多个处理程序映射。
因此,如果你需要做一些完全通用的事情(例如记录所有请求) ,那么一个过滤器就足够了——但是如果行为取决于目标处理程序,或者你想在请求处理和视图呈现之间做一些事情,那么 HandlerInterceptor 提供了这种灵活性。
Filter :-顾名思义,过滤器是 servlet 容器为每个传入的 HTTP 请求和每个 HTTP 响应执行的 Java 类。这种方法可以在 HTTP 传入请求到达资源之前管理它们,比如 JSP 页面、 servlet 或简单的静态页面; 同样,也可以在资源执行之后管理 HTTP 出站响应。
Interceptor :-Spring Interceptor 类似于 Servlet Filters,但是它们在 Spring 上下文中起作用,因此可以强大地管理 HTTP 请求和响应,但是它们可以实现更复杂的行为,因为它们可以访问所有 Spring 上下文。
来自 Baeldung:
筛选器在请求到达 DispatcherServlet 之前拦截它们,使它们成为粗粒度任务的理想选择,例如:
Authentication Logging and auditing Image and data compression Any functionality we want to be decoupled from Spring MVC
另一方面,HandlerIntercepors 拦截 DispatcherServlet 和控制器之间的请求。这是在 Spring MVC 框架内完成的,提供对 Handler 和 ModelAndView 对象的访问。这样可以减少重复,并允许更细粒度的功能,例如:
Handling cross-cutting concerns such as application logging Detailed authorization checks Manipulating the Spring context or model