我对document.getElementsByTagName("body")[0].addEventListener("touchstart",
function(e) { e.returnValue = false });
和Filter
目的感到有些困惑。
正如我从文档中所理解的那样,Interceptor
在请求之间运行。另一方面,Interceptor
在渲染视图之前运行,但在Controller渲染响应之后。
那么Interceptor中的Filter
和Filter中的postHandle()
之间的区别在哪里?
答案 0 :(得分:54)
引自HandlerIntercepter
' javadoc:
HandlerInterceptor
基本上类似于ServletFilter
,但是在 与后者相比,它只允许自定义预处理 禁止执行处理程序本身和自定义的选项 后期处理。过滤器功能更强大,例如它们允许的 交换传递的请求和响应对象 链。请注意,过滤器在web.xml
中配置,a 应用程序上下文中的HandlerInterceptor
。作为基本准则,与细粒度处理程序相关的预处理任务 是
HandlerInterceptor
实施的候选人,尤其是 分解出来的公共处理程序代码和授权检查。在 另一方面,Filter
非常适合请求内容和视图 内容处理,如多部分表单和GZIP压缩。这个 通常显示何时需要将过滤器映射到某些内容 类型(例如图像)或所有请求。
话虽如此:
那么Interceptor和PostHandle()之间的区别在哪里 过滤器中的doFilter()?
postHandle
将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图添加更多模型对象,但您可以不更改HttpServletResponse
,因为它已经提交。 doFilter
比postHandle
更通用。您可以更改请求或响应并将其传递给链,甚至阻止请求处理。
此外,在preHandle
和postHandle
方法中,您可以访问处理请求的HandlerMethod
。因此,您可以根据处理程序本身添加事先处理逻辑。例如,您可以为具有某些注释的处理程序方法添加逻辑。
应该使用哪些用例的最佳做法是什么?
正如文档所说,细粒度处理程序相关的预处理任务是HandlerInterceptor
实现的候选者,尤其是分解出来的公共处理程序代码和授权检查。另一方面,Filter
非常适合请求内容和视图内容处理,如多部分表单和GZIP压缩。这通常表示何时需要将过滤器映射到某些内容类型(例如图像)或所有请求。
答案 1 :(得分:3)
HandlerInterceptor为您提供了比过滤器更精细的控制,因为您可以访问实际的目标“处理程序” - 这意味着您执行的任何操作都可能因请求实际执行的操作而异(而servlet过滤器)通常应用于所有请求 - 只能考虑每个请求的参数)。 handlerInterceptor还提供了3种不同的方法,因此您可以在调用处理程序之前,在处理程序完成之后但在查看呈现之前(甚至可以绕过视图呈现)之前,或者在呈现视图本身之后应用行为。此外,您可以为不同的处理程序组设置不同的拦截器 - 拦截器在handlerMapping上配置,并且可能有多个handlerMappings。
因此,如果您需要执行完全通用的操作(例如,记录所有请求),那么过滤器就足够了 - 但是如果行为依赖于目标处理程序,或者您希望在请求处理和视图呈现之间执行某些操作,然后HandlerInterceptor提供了这种灵活性。
答案 2 :(得分:2)
过滤器:-过滤器顾名思义是由servlet容器为每个传入的HTTP请求和每个http响应执行的Java类。这样,可以在HTTP传入请求到达资源(例如JSP页面,Servlet或简单的静态页面)之前管理它们。以同样的方式可以在资源执行后管理HTTP出站响应。
拦截器:-Spring拦截器类似于Servlet过滤器,但是它们在Spring Context中起作用,因此有很多强大的功能来管理HTTP请求和响应,但是它们可以实现更复杂的行为,因为可以访问所有Spring上下文