我有点困惑 Filter
以及 Interceptor
目的。
我从医生那里了解到, Interceptor
在请求之间运行。另一方面 Filter
在呈现视图之前运行,但在控制器呈现响应之后运行。
那么两者的区别在哪里呢 postHandle()
在拦截器和 doFilter()
在过滤器里?
在哪些用例中应该使用它的最佳实践是什么?在这张照片里 Filter
s和 Interceptor
什么?
我有点困惑 Filter
以及 Interceptor
目的。
我从医生那里了解到, Interceptor
在请求之间运行。另一方面 Filter
在呈现视图之前运行,但在控制器呈现响应之后运行。
那么两者的区别在哪里呢 postHandle()
在拦截器和 doFilter()
在过滤器里?
在哪些用例中应该使用它的最佳实践是什么?在这张照片里 Filter
s和 Interceptor
什么?
3条答案
按热度按时间lndjwyie1#
从
HandlerIntercepter
的javadoc:HandlerInterceptor
基本上类似于servletFilter
,但与后者不同的是,它只允许自定义预处理,并可以选择禁止执行处理程序本身,以及自定义后处理。过滤器更强大,例如,它们允许交换传递给链的请求和响应对象。请注意,过滤器是在中配置的web.xml
,一个HandlerInterceptor
在应用程序上下文中。作为基本准则,与细粒度处理程序相关的预处理任务是
HandlerInterceptor
实现,特别是排除了常见的处理程序代码和授权检查。另一方面Filter
非常适合于请求内容和视图内容处理,如多部分表单和gzip压缩。这通常显示何时需要将筛选器Map到某些内容类型(例如图像)或所有请求。话说回来:
那么两者的区别在哪里呢
Interceptor#postHandle()
以及Filter#doFilter()
?postHandle
将在处理程序方法调用之后但在呈现视图之前调用。因此,可以向视图中添加更多模型对象,但不能更改HttpServletResponse
既然已经承诺了。doFilter
它比postHandle
. 您可以更改请求或响应并将其传递给链,甚至可以阻止请求处理。另外,在
preHandle
以及postHandle
方法,您可以访问HandlerMethod
已经处理了请求。因此,您可以基于处理程序本身添加预/后处理逻辑。例如,可以为具有某些注解的处理程序方法添加逻辑。在哪些用例中应该使用它的最佳实践是什么?
正如doc所说,与细粒度处理程序相关的预处理任务是
HandlerInterceptor
实现,特别是排除了常见的处理程序代码和授权检查。另一方面Filter
非常适合于请求内容和视图内容处理,如多部分表单和gzip压缩。这通常显示何时需要将筛选器Map到某些内容类型(例如图像)或所有请求。hmtdttj42#
filter:-顾名思义,filter是servlet容器为每个传入的http请求和每个http响应执行的java类。这样,就可以在http传入请求到达资源之前对其进行管理,例如jsp页面、servlet或简单的静态页面;以同样的方式,可以在资源执行之后管理http出站响应。
拦截器:-spring拦截器类似于servlet过滤器,但它们在spring上下文中起作用,因此在管理http请求和响应方面非常强大,但它们可以实现更复杂的行为,因为它们可以访问所有spring上下文。
ndh0cuux3#
handlerinterceptor比过滤器提供更细粒度的控制,因为您可以访问实际的目标“handler”——这意味着您执行的任何操作都可能因请求实际执行的操作而异(而servlet过滤器通常应用于所有请求——只能考虑每个请求的参数)。handlerinterceptor还提供了3种不同的方法,因此您可以在调用处理程序之前、处理程序完成之后但在视图呈现之前(您甚至可以完全绕过视图呈现)或视图本身呈现之后应用行为。另外,您可以为不同的处理程序组设置不同的拦截器—拦截器在handlermapping上配置,并且可能有多个handlermapping。
因此,如果您需要做一些完全通用的事情(例如记录所有请求),那么一个过滤器就足够了——但是如果行为取决于目标处理程序或者您想在请求处理和视图呈现之间做一些事情,那么handlerinterceptor就提供了这种灵活性。
参考文献:http://static.springframework.org/sp...ng-interceptor