rpi*_*zek 78 java spring spring-mvc spring-boot
我有点困惑Filter
和Interceptor
目的.
正如我从文档中所理解的那样,Interceptor
在请求之间运行.另一方面Filter
,在渲染视图之前运行,但在Controller渲染响应之后.
那么postHandle()
Interceptor和doFilter()
Filter 之间的区别在哪里?
小智 76
来自baeldung:
过滤器在请求到达 DispatcherServlet 之前拦截请求,这使得它们非常适合粗粒度任务,例如:
Authentication
Logging and auditing
Image and data compression
Any functionality we want to be decoupled from Spring MVC
Run Code Online (Sandbox Code Playgroud)
另一方面,HandlerIntercepors 拦截 DispatcherServlet 和我们的控制器之间的请求。这是在 Spring MVC 框架内完成的,提供对 Handler 和 ModelAndView 对象的访问。这减少了重复并允许更细粒度的功能,例如:
Handling cross-cutting concerns such as application logging
Detailed authorization checks
Manipulating the Spring context or model
Run Code Online (Sandbox Code Playgroud)
Ali*_*ani 69
从引用HandlerIntercepter
的javadoc的:
HandlerInterceptor
基本上类似于ServletFilter
,但与后者相比,它只允许自定义预处理,可以选择禁止执行处理程序本身,以及自定义后处理.过滤器功能更强大,例如,它们允许交换传递链中的请求和响应对象.请注意,过滤器在应用程序上下文中配置为web.xml
aHandlerInterceptor
.作为基本准则,细粒度处理程序相关的预处理任务是
HandlerInterceptor
实现的候选者,尤其是分解出来的公共处理程序代码和授权检查.另一方面,aFilter
非常适合请求内容和视图内容处理,如多部分表单和GZIP压缩.这通常表示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求.
话虽如此:
那么Interceptor中的PostHandle()和Filter中的doFilter()之间的区别在哪里?
postHandle
将在处理程序方法调用之后但在呈现视图之前调用.因此,您可以向视图添加更多模型对象,但由于已经提交,因此无法更改HttpServletResponse
.doFilter
比它更通用postHandle
.您可以更改请求或响应并将其传递给链,甚至阻止请求处理.
此外,您可以访问处理请求的方法preHandle
和postHandle
方法HandlerMethod
.因此,您可以根据处理程序本身添加事先处理逻辑.例如,您可以为具有某些注释的处理程序方法添加逻辑.
应该使用哪些用例的最佳做法是什么?
正如文档所说,细粒度处理程序相关的预处理任务是HandlerInterceptor
实现的候选者,尤其是分解出来的公共处理程序代码和授权检查.另一方面,a Filter
非常适合请求内容和视图内容处理,如多部分表单和GZIP压缩.这通常表示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求.
小智 23
过滤器: - 顾名思义,过滤器是由 servlet 容器为每个传入的 HTTP 请求和每个 HTTP 响应执行的 Java 类。这种方式可以在 HTTP 传入请求到达资源之前对其进行管理,例如 JSP 页面、servlet 或简单的静态页面;以同样的方式,可以在资源执行后管理 HTTP 出站响应。
拦截器: - Spring 拦截器类似于 Servlet 过滤器,但它们在 Spring Context 中运行,因此在管理 HTTP 请求和响应方面功能强大,但它们可以实现更复杂的行为,因为它们可以访问所有 Spring 上下文。
HandlerInterceptor比过滤器为您提供更细粒度的控制,因为您可以访问实际的目标“处理程序”-这意味着您执行的任何操作都可能会根据请求的实际执行情况而有所不同(而Servlet过滤器通常会应用所有请求-仅能够考虑每个请求的参数)。handlerInterceptor还提供3种不同的方法,因此您可以在调用处理程序之前,处理程序完成之后,视图渲染之前(甚至可以完全绕过视图渲染)或视图本身渲染之后,应用行为。另外,您可以为不同的处理程序组设置不同的拦截器-拦截器在handlerMapping上配置,并且可能有多个handlerMappings。
因此,如果您需要做一些完全通用的事情(例如记录所有请求),那么过滤器就足够了;但是,如果行为取决于目标处理程序,或者您想在请求处理和视图呈现之间做点什么,则HandlerInterceptor提供了这种灵活性。
参考:http : //static.springframework.org/sp...ng-interceptor
归档时间: |
|
查看次数: |
65604 次 |
最近记录: |