java——springmvc中拦截器和过滤器的区别

idv4meu8  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(281)

我有点困惑 Filter 以及 Interceptor 目的。
我从医生那里了解到, Interceptor 在请求之间运行。另一方面 Filter 在呈现视图之前运行,但在控制器呈现响应之后运行。
那么两者的区别在哪里呢 postHandle() 在拦截器和 doFilter() 在过滤器里?

在哪些用例中应该使用它的最佳实践是什么?在这张照片里 Filter s和 Interceptor 什么?

lndjwyie

lndjwyie1#

HandlerIntercepter 的javadoc: HandlerInterceptor 基本上类似于servlet Filter ,但与后者不同的是,它只允许自定义预处理,并可以选择禁止执行处理程序本身,以及自定义后处理。过滤器更强大,例如,它们允许交换传递给链的请求和响应对象。请注意,过滤器是在中配置的 web.xml ,一个 HandlerInterceptor 在应用程序上下文中。
作为基本准则,与细粒度处理程序相关的预处理任务是 HandlerInterceptor 实现,特别是排除了常见的处理程序代码和授权检查。另一方面 Filter 非常适合于请求内容和视图内容处理,如多部分表单和gzip压缩。这通常显示何时需要将筛选器Map到某些内容类型(例如图像)或所有请求。
话说回来:
那么两者的区别在哪里呢 Interceptor#postHandle() 以及 Filter#doFilter() ? postHandle 将在处理程序方法调用之后但在呈现视图之前调用。因此,可以向视图中添加更多模型对象,但不能更改 HttpServletResponse 既然已经承诺了。 doFilter 它比 postHandle . 您可以更改请求或响应并将其传递给链,甚至可以阻止请求处理。
另外,在 preHandle 以及 postHandle 方法,您可以访问 HandlerMethod 已经处理了请求。因此,您可以基于处理程序本身添加预/后处理逻辑。例如,可以为具有某些注解的处理程序方法添加逻辑。
在哪些用例中应该使用它的最佳实践是什么?
正如doc所说,与细粒度处理程序相关的预处理任务是 HandlerInterceptor 实现,特别是排除了常见的处理程序代码和授权检查。另一方面 Filter 非常适合于请求内容和视图内容处理,如多部分表单和gzip压缩。这通常显示何时需要将筛选器Map到某些内容类型(例如图像)或所有请求。

hmtdttj4

hmtdttj42#

filter:-顾名思义,filter是servlet容器为每个传入的http请求和每个http响应执行的java类。这样,就可以在http传入请求到达资源之前对其进行管理,例如jsp页面、servlet或简单的静态页面;以同样的方式,可以在资源执行之后管理http出站响应。
拦截器:-spring拦截器类似于servlet过滤器,但它们在spring上下文中起作用,因此在管理http请求和响应方面非常强大,但它们可以实现更复杂的行为,因为它们可以访问所有spring上下文。

ndh0cuux

ndh0cuux3#

handlerinterceptor比过滤器提供更细粒度的控制,因为您可以访问实际的目标“handler”——这意味着您执行的任何操作都可能因请求实际执行的操作而异(而servlet过滤器通常应用于所有请求——只能考虑每个请求的参数)。handlerinterceptor还提供了3种不同的方法,因此您可以在调用处理程序之前、处理程序完成之后但在视图呈现之前(您甚至可以完全绕过视图呈现)或视图本身呈现之后应用行为。另外,您可以为不同的处理程序组设置不同的拦截器—拦截器在handlermapping上配置,并且可能有多个handlermapping。
因此,如果您需要做一些完全通用的事情(例如记录所有请求),那么一个过滤器就足够了——但是如果行为取决于目标处理程序或者您想在请求处理和视图呈现之间做一些事情,那么handlerinterceptor就提供了这种灵活性。
参考文献:http://static.springframework.org/sp...ng-interceptor

相关问题