Spring MVC中的拦截器和过滤器之间的区别


108

我有点有点困惑FilterInterceptor目的。

据我从文档了解,Interceptor是在请求之间运行。另一方面Filter在渲染视图之前运行,但在Controller渲染响应之后运行。

那么postHandle()拦截器和doFilter()过滤器之间的区别在哪里?

春季MVC Sheme 应在哪些用例中使用的最佳实践是什么?在这张图片中Filters和Interceptors 在哪里工作?

Answers:


87

HandlerIntercepterjavadoc

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

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

话虽这么说:

那么Interceptor#postHandle()和 之间的区别在Filter#doFilter()哪里?

postHandle将在处理程序方法调用之后但呈现视图之前被调用。因此,您可以向视图中添加更多模型对象,但是由于已提交,因此无法更改HttpServletResponse

doFilterpostHandle。更加通用。您可以更改请求或响应并将其传递给链,甚至阻止请求处理。

另外,在preHandlepostHandle方法中,您可以访问HandlerMethod处理请求的。因此,您可以基于处理程序本身添加预处理/后处理逻辑。例如,您可以为具有某些注释的处理程序方法添加逻辑。

应在哪些用例中使用的最佳实践是什么?

正如文档所说,与处理程序相关的细粒度预处理任务是HandlerInterceptor实现的候选对象,特别是分解出的公共处理程序代码和授权检查。另一方面,a Filter非常适合请求内容和视图内容处理,例如多部分表单和GZIP压缩。这通常显示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求。


请注意,在应用程序上下文中的HandlerInterceptor web.xml中配置了过滤器???你能解释一下吗?

4
过滤器与Servlet API有关,并且HandlerIntercepter是Spring的特定概念。为了注册Servlet过滤器,可以使用web.xml旧版本(Servlet 2.5和较旧版本)注册它,也可以使用新的编程方法(Servlet 3+)注册它。由于HandlerIntercepter仅仅是Spring的抽象,因此您应该在Spring的上下文中进行注册
Ali Dehghani

Filter与Servlet API有关,而HandlerIntercepter是Spring的特定概念。or!但是,无论通过web.xml注册的WebApplication内容是每个调度程序是单个的一部分,因此servlet和filter都与上下文相关联,因此将拦截器和filter关联起来是一个好习惯,rootContext因此,如果您有多个调度程序都可以共享相同的内容。

9

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

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


2
来源:mkjava.com/tutorial/filter-vs-interceptor必须提及来源
Premraj,

关于Spring安全过滤器,它还为您提供Spring上下文。
罗文

6

HandlerInterceptor比过滤器为您提供更细粒度的控制,因为您可以访问实际的目标“处理程序”-这意味着您执行的任何操作都可能取决于请求的实际操作而有所不同(而Servlet过滤器通常适用所有请求-仅能够考虑每个请求的参数)。handlerInterceptor还提供3种不同的方法,以便您可以在调用处理程序之前,处理程序完成之后,视图渲染之前(甚至可以完全绕过视图渲染)或视图本身渲染之后,应用行为。另外,您可以为不同的处理程序组设置不同的侦听器-侦听器是在handlerMapping上配置的,并且可能有多个handlerMappings。

因此,如果您需要做一些完全通用的事情(例如,记录所有请求),那么过滤器就足够了;但是,如果行为取决于目标处理程序,或者您想在请求处理和视图呈现之间做点什么,则HandlerInterceptor提供了这种灵活性。

参考:http : //static.springframework.org/sp...ng-interceptor


2
链接断开。
Jason Law
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.