Spring HandlerInterceptor与Servlet过滤器

时间:2011-11-03 19:38:43

标签: spring spring-mvc servlet-filters interceptor

现在可以将Spring中的

HandlerInterceptor配置为仅使用<mvc:interceptors>在某些网址上调用。

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

我认为使用Interceptors,可以使用ModelAndView对象来处理模型,因此它具有更多优势。任何人都可以提出过滤器或拦截器优于其他场景的场景吗?

4 个答案:

答案 0 :(得分:58)

org.springframework.web.servlet.HanderInterceptor界面JavaDoc本身有两段讨论这个问题:

  

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

     

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

答案 1 :(得分:25)

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

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

Servlet Filter:

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

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

enter image description here

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

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

  1. init :执行该操作以使用init中的init-param元素初始化过滤器 过滤器定义。
  2. doFilter :对满足以下条件的所有HTTP传入请求执行 “网址模式”。
  3. destroy :释放过滤器使用的资源。

Interceptor:

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

enter image description here

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

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

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