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

时间:2016-03-07 23:51:57

标签: java spring spring-mvc spring-boot

我对document.getElementsByTagName("body")[0].addEventListener("touchstart", function(e) { e.returnValue = false }); Filter目的感到有些困惑。

正如我从文档中所理解的那样,Interceptor在请求之间运行。另一方面,Interceptor在渲染视图之前运行,但在Controller渲染响应之后。

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

Spring MVC sheme 应该使用哪些用例的最佳做法是什么? 在这张图片中doFilter() s和Filter s?

3 个答案:

答案 0 :(得分:54)

引自HandlerIntercepter' javadoc

  

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

     

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

话虽如此:

  

那么Interceptor和PostHandle()之间的区别在哪里   过滤器中的doFilter()?

postHandle将在处理程序方法调用之后但在呈现视图之前调用。因此,您可以向视图添加更多模型对象,但您可以更改HttpServletResponse,因为它已经提交。 doFilterpostHandle更通用。您可以更改请求或响应并将其传递给链,甚至阻止请求处理。

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

  

应该使用哪些用例的最佳做法是什么?

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

答案 1 :(得分:3)

HandlerInterceptor为您提供了比过滤器更精细的控制,因为您可以访问实际的目标“处理程序” - 这意味着您执行的任何操作都可能因请求实际执行的操作而异(而servlet过滤器)通常应用于所有请求 - 只能考虑每个请求的参数)。 handlerInterceptor还提供了3种不同的方法,因此您可以在调用处理程序之前,在处理程序完成之后但在查看呈现之前(甚至可以绕过视图呈现)之前,或者在呈现视图本身之后应用行为。此外,您可以为不同的处理程序组设置不同的拦截器 - 拦截器在handlerMapping上配置,并且可能有多个handlerMappings。

因此,如果您需要执行完全通用的操作(例如,记录所有请求),那么过滤器就足够了 - 但是如果行为依赖于目标处理程序,或者您希望在请求处理和视图呈现之间执行某些操作,然后HandlerInterceptor提供了这种灵活性。

参考:http://static.springframework.org/sp...ng-interceptor

答案 2 :(得分:2)

过滤器:-过滤器顾名思义是由servlet容器为每个传入的HTTP请求和每个http响应执行的Java类。这样,可以在HTTP传入请求到达资源(例如JSP页面,Servlet或简单的静态页面)之前管理它们。以同样的方式可以在资源执行后管理HTTP出站响应。

拦截器:-Spring拦截器类似于Servlet过滤器,但是它们在Spring Context中起作用,因此有很多强大的功能来管理HTTP请求和响应,但是它们可以实现更复杂的行为,因为可以访问所有Spring上下文