Spring HandlerInterceptor与Servletfilter

Spring中的HandlerInterceptor现在可以被configuration为仅在特定的URL上使用<mvc:interceptors>来调用。

Servletfilter可以实现相同的function(日志logging,安全等)。 那么应该使用哪一个?

我认为使用拦截器,可以使用ModelAndView对象来处理模型,所以它具有更多的优势。 任何人都可以画出filter或拦截器相比其他优势的情况吗?

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

HandlerInterceptor基本上类似于Servlet 2.3 Filter,但与后者相反,它只允许自定义预处理,禁止执行处理程序本身和自定义后处理。 filterfunction更强大,例如它们允许交换传送链中的请求和响应对象。 请注意,filter在应用程序上下文中的web.xml(一个HandlerInterceptor)中进行configuration。

作为一个基本的准则,细粒度的处理程序相关的预处理任务是HandlerInterceptor实现的候选人,特别是对常用处理程序代码和授权检查进行了分解。 另一方面,filter非常适合请求内容和查看内容处理,如多部分表单和GZIP压缩。 这通常显示何时需要将filter映射到特定内容types(例如图像)或所有请求。

Spring处理程序拦截器允许您挂接请求生命周期的更多部分,并在此过程中获取更多信息。 它们通常比filter更紧密地连接到请求/响应周期。

将您的请求/响应视为黑匣子系统时,filter更合适。 无论servlet是如何实现的,他们都会工作。

如果您使用的是Spring MVC,那么没有必要将新的逻辑写成servletfilter。 一切filter都可以做,拦截器可以做得更轻松,更优雅。

请记住,servletfilter的使用时间要比拦截器长得多。

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