我对 Filter
和 Interceptor
用途有点困惑。
正如我从文档中了解到的那样, Interceptor
在请求之间运行。另一方面 Filter
在渲染视图之前运行,但在控制器渲染响应之后。
那么拦截器中的 doFilter()
和过滤器中的 postHandle()
之间的区别在哪里?
应该在哪些用例中使用它的最佳实践是什么?在这张图片中
Filter
s 和 Interceptor
s 工作在哪里?
原文由 rpieniazek 发布,翻译遵循 CC BY-SA 4.0 许可协议
从
HandlerIntercepter
的 javadoc :话虽如此:
postHandle
将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图添加更多模型对象,但 不能 更改HttpServletResponse
因为它已经提交。doFilter
比postHandle
更加通用。您可以更改请求或响应并将其传递给链,甚至阻止请求处理。此外,在
preHandle
和postHandle
方法中,您可以访问处理请求的HandlerMethod
。因此,您可以根据处理程序本身添加预处理/后处理逻辑。例如,您可以为具有一些注释的处理程序方法添加逻辑。正如文档所说,细粒度的处理程序相关的预处理任务是
HandlerInterceptor
实现的候选者,特别是分解出的通用处理程序代码和授权检查。另一方面,Filter
非常适合请求内容和查看内容处理,例如多部分表单和 GZIP 压缩。这通常显示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求。