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

2skhul33  于 2023-05-05  发布在  Java
关注(0)|答案(4)|浏览(103)

我对FilterInterceptor的用途有点困惑。
正如我从文档中了解到的,Interceptor在请求之间运行。另一方面,Filter在渲染视图之前运行,但在Controller渲染响应之后运行。
那么拦截器中的postHandle()和过滤器中的doFilter()之间的区别在哪里呢?


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

twh00eeo

twh00eeo1#

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

z31licg0

z31licg02#

从baeldung:

过滤器在请求到达DispatcherServlet之前拦截请求,使其成为粗粒度任务的理想选择,例如:

Authentication
Logging and auditing
Image and data compression
Any functionality we want to be decoupled from Spring MVC

另一方面,HandlerIntercepors拦截DispatcherServlet和Controller之间的请求。这是在Spring MVC框架中完成的,提供了对Handler和ModelAndView对象的访问。这减少了重复,并允许更细粒度的功能,例如:

Handling cross-cutting concerns such as application logging
Detailed authorization checks
Manipulating the Spring context or model
kb5ga3dv

kb5ga3dv3#

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

qybjjes1

qybjjes14#

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

相关问题