Spring HandlerInterceptor与Servlet过滤器

ace*_*es. 63 spring spring-mvc interceptor servlet-filters

Spring中的HandlerInterceptor现在可以配置为仅在某些URL上使用调用<mvc:interceptors>.

Servlet过滤器可以实现相同的功能(日志记录,安全性等).那应该用哪一个?

我认为使用Interceptors,可以使用ModelAndView对象与模型一起工作,因此它具有更多优势.任何人都可以提出过滤器或拦截器比另一个有优势的场景吗?

Ral*_*lph 58

org.springframework.web.servlet.HanderInterceptor接口的JavaDoc本身有两个段落讨论这个问题:

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

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

  • @aces:是的:springframework HanderInterceptor的主要优点是 - 它们可以在Controller Handling和View Rendering之间进行拦截,而且它们是spring Beans,因此很容易访问其他spring bean. (3认同)
  • 所以现在我有2个观点.显然以前的帖子暗示HandlerInterceptors更强大.我知道HandlerInterceptors是Spring Framework的一部分,在Spring之外,我认为它们不能被使用.但是在基于Spring的项目中,它们不比过滤器更有优势吗? (2认同)

ska*_*man 25

Spring Handler拦截器允许您挂钩请求生命周期的更多部分,并在此过程中访问更多信息.与过滤器相比,它们通常与请求/响应周期更紧密地耦合.

将请求/响应视为黑匣子系统时,过滤器更适合.无论servlet如何实现,它们都可以工作.

如果您正在使用Spring MVC,那么没有理由将新逻辑编写为servlet过滤器.所有过滤器都可以做到,拦截器可以更轻松,更优雅地完成.

还要记住,servlet过滤器比拦截器存在的时间要长得多.

  • Spring Handler拦截器不能做一件事 - 将请求/响应对象包装在自定义类型中.据我所知,你还需要一个过滤器. (13认同)
  • @aces:我能想到的唯一场景是,如果你在同一个webapp中有多个DispatcherServlet,并且你想拦截所有这些的请求.但事实并非如此. (8认同)

Nom*_*tar 6

Servlet Filter:

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

此行为允许实现在许多不同上下文中重用的通用功能。

在此输入图像描述

如上图所示,过滤器在Web容器中运行,因此其定义也将包含在web.xml文件中。

过滤器主要包括三种方法:

  1. init:执行以使用过滤器定义中的 init-param 元素初始化过滤器。
  2. doFilter:对所有满足“url-pattern”的 HTTP 传入请求执行。
  3. destroy:释放过滤器使用的资源。

Interceptor:

Spring 拦截器与 Servlet 过滤器类似,但它们在 Spring 上下文中运行,因此在管理 HTTP 请求和响应方面功能强大,但它们可以实现更复杂的行为,因为可以访问所有 Spring 上下文。

在此输入图像描述

Spring拦截器在SpringMVC上下文中执行,因此它们已在rest-servlet.xml文件中定义:

拦截器主要包括三个方法:

  1. preHandle:在目标资源执行之前执行。
  2. afterCompletion:在目标资源执行后(渲染视图后)执行。
  3. postHandle:拦截处理程序的执行。


smp*_*p7d 5

使用 Spring 拦截器,您可以访问可能有用的 Handler。此外,使用 Spring 拦截器,您可以在视图呈现之前和视图呈现之后访问执行逻辑。

  • 过滤器(在 Servlet 中)可以在从 Servlet 向客户端(浏览器)发送响应时更改响应。当 Spring Controller 将响应发送回客户端(浏览器)时,我们是否可以以同样的方式更改响应或操作响应对象?如果答案是否定的,那么这样做的替代方法是什么?我不想使用过滤器(在 Servlet 中)。 (2认同)