我有点有点困惑Filter
和Interceptor
目的。
据我从文档了解,Interceptor
是在请求之间运行。另一方面Filter
在渲染视图之前运行,但在Controller渲染响应之后运行。
那么postHandle()
拦截器和doFilter()
过滤器之间的区别在哪里?
我有点有点困惑Filter
和Interceptor
目的。
据我从文档了解,Interceptor
是在请求之间运行。另一方面Filter
在渲染视图之前运行,但在Controller渲染响应之后运行。
那么postHandle()
拦截器和doFilter()
过滤器之间的区别在哪里?
Answers:
从HandlerIntercepter
的javadoc:
HandlerInterceptor
基本上与Servlet类似Filter
,但是与Servlet 相比,它仅允许自定义预处理,并可以选择禁止执行处理程序本身和自定义后处理。过滤器功能更强大,例如,它们允许交换传递给链的请求和响应对象。请注意,在应用程序上下文中的中web.xml
, 配置了过滤器HandlerInterceptor
。作为基本准则,与处理程序相关的细粒度预处理任务是
HandlerInterceptor
实现的候选对象,尤其是分解出的公共处理程序代码和授权检查。另一方面,aFilter
非常适合请求内容和视图内容处理,例如多部分表单和GZIP压缩。这通常显示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求。
话虽这么说:
那么
Interceptor#postHandle()
和 之间的区别在Filter#doFilter()
哪里?
postHandle
将在处理程序方法调用之后但呈现视图之前被调用。因此,您可以向视图中添加更多模型对象,但是由于已提交,因此无法更改HttpServletResponse
。
doFilter
比postHandle
。更加通用。您可以更改请求或响应并将其传递给链,甚至阻止请求处理。
另外,在preHandle
和postHandle
方法中,您可以访问HandlerMethod
处理请求的。因此,您可以基于处理程序本身添加预处理/后处理逻辑。例如,您可以为具有某些注释的处理程序方法添加逻辑。
应在哪些用例中使用的最佳实践是什么?
正如文档所说,与处理程序相关的细粒度预处理任务是HandlerInterceptor
实现的候选对象,特别是分解出的公共处理程序代码和授权检查。另一方面,a Filter
非常适合请求内容和视图内容处理,例如多部分表单和GZIP压缩。这通常显示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求。
HandlerIntercepter
是Spring的特定概念。为了注册Servlet过滤器,可以使用web.xml
旧版本(Servlet 2.5和较旧版本)注册它,也可以使用新的编程方法(Servlet 3+)注册它。由于HandlerIntercepter
仅仅是Spring的抽象,因此您应该在Spring的上下文中进行注册
过滤器 -顾名思义,过滤器是servlet容器为每个传入的HTTP请求和每个http响应执行的Java类。这样,可以在HTTP传入请求到达资源(例如JSP页面,Servlet或简单的静态页面)之前管理它们。以相同的方式可以在资源执行后管理HTTP出站响应。
拦截器:-Spring拦截器类似于Servlet过滤器,但是它们在Spring Context中起作用,因此有许多强大的功能来管理HTTP请求和响应,但是它们可以实现更复杂的行为,因为可以访问所有Spring上下文。
HandlerInterceptor比过滤器为您提供更细粒度的控制,因为您可以访问实际的目标“处理程序”-这意味着您执行的任何操作都可能取决于请求的实际操作而有所不同(而Servlet过滤器通常适用所有请求-仅能够考虑每个请求的参数)。handlerInterceptor还提供3种不同的方法,以便您可以在调用处理程序之前,处理程序完成之后,视图渲染之前(甚至可以完全绕过视图渲染)或视图本身渲染之后,应用行为。另外,您可以为不同的处理程序组设置不同的侦听器-侦听器是在handlerMapping上配置的,并且可能有多个handlerMappings。
因此,如果您需要做一些完全通用的事情(例如,记录所有请求),那么过滤器就足够了;但是,如果行为取决于目标处理程序,或者您想在请求处理和视图呈现之间做点什么,则HandlerInterceptor提供了这种灵活性。