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

新手上路,请多包涵

我对 FilterInterceptor 用途有点困惑。

正如我从文档中了解到的那样, Interceptor 在请求之间运行。另一方面 Filter 在渲染视图之前运行,但在控制器渲染响应之后。

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

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

原文由 rpieniazek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 875
2 个回答

HandlerIntercepterjavadoc

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

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

话虽如此:

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

postHandle 将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图添加更多模型对象,但 不能 更改 HttpServletResponse 因为它已经提交。

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

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

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

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

原文由 Ali Dehghani 发布,翻译遵循 CC BY-SA 4.0 许可协议

baeldung :

过滤器与拦截器

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

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

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

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

原文由 MMJ 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题