HandlerInterceptor配置为仅使用<mvc:interceptors>
在某些网址上调用。
Servlet过滤器可以实现相同的功能(日志记录,安全性等)。那么应该使用哪一个?
我认为使用Interceptors,可以使用ModelAndView
对象来处理模型,因此它具有更多优势。任何人都可以提出过滤器或拦截器优于其他场景的场景吗?
答案 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出站响应。
此行为允许实现在许多不同上下文中重用的通用功能。
如上图所示,过滤器在Web容器中运行,因此其定义也将包含在web.xml文件中。
过滤器包括三种主要方法:
Interceptor:
Spring Interceptor与Servlet过滤器类似,但它们在Spring Context中起作用,因此在管理HTTP请求和响应方面功能强大,但由于可以访问所有Spring上下文,因此它们可以实现更为复杂的行为。
Spring拦截器在SpringMVC上下文中执行,因此它们已在rest-servlet.xml文件中定义:
拦截器包括三种主要方法: