Spring HandlerInterceptor与Servlet过滤器

问题描述 投票:64回答:4
HandlerInterceptor s配置为仅使用<mvc:interceptors>在某些URL上调用。

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

我认为使用Interceptor,可以使用ModelAndView对象与模型一起使用,因此它具有更多的优势。任何人都可以提出过滤器或拦截器比其他方法更具优势的方案吗?

spring spring-mvc servlet-filters interceptor
4个回答
60
投票
org.springframework.web.servlet.HanderInterceptor接口JavaDoc本身有两个段落讨论了这个问题:

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

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


26
投票
Spring Handler拦截器使您可以插入请求生命周期的更多部分,并在过程中访问更多信息。与过滤器相比,它们通常更紧密地耦合到请求/响应周期。

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

[如果您使用的是Spring MVC,则没有理由将新逻辑编写为servlet过滤器。过滤器可以做的所有事情,拦截器可以做得更轻松,更优雅。

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


4
投票
使用Spring拦截器,您可以访问Handler,这可能会很有用。同样,使用Spring拦截器,您可以在视图渲染之前和视图渲染之后执行逻辑。

0
投票

Servlet Filter:

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

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

enter image description here

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

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

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

Interceptor:

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

enter image description here

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

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

  1. preHandle:在执行目标资源之前执行。
  2. afterCompletion
  3. :在执行目标资源之后执行(渲染视图后)。
  4. postHandle
  5. :拦截处理程序的执行。
© www.soinside.com 2019 - 2024. All rights reserved.