过滤器和拦截器的区别
1.过滤器(Filter)
可以直接实现Filter接口,接口中定义了三个方法。
- init():该方法在容器初始化过滤器时被调用,整个生命周期只调用一次,切必须执行成功,否则过滤器无效。
- doFilter():容器中的每一次请求都会调用,FilterChain用来调下一个过滤器。
- destroy():当容器销毁过滤器实例,调用该方法,一般用来关闭资源。整个生命周期只调用一次。
2.拦截器(Interceptor)
与过滤器不同,拦截器可以同时存在多个,进行链式调用,一个请求可以触发多个拦截器,按顺序执行。通过实现HandlerInterceptor接口来实现,同样定义了三个方法。
- preHandle():请求处理前调用,返回值为false,结束当前请求,之后的拦截器也不再执行。
- postHandle(): 在preHandle()方法返回值为true时调用,在进入Controller之后,DispatchServlet渲染视图之前调用,调用顺序和栈的数据结构相似,先声明的后调用,最后声明的反而第一个调用。
- afterCompletion():只有在preHandle()方法返回值为true才执行,在整个请求结束后,DispatcherServlet渲染视图之后。
3.不同之处
二者皆体现了AOP编程思想,通常用于日志记录,登录验证,权限过滤等功能。
-
1.实现方式
过滤器基于函数回调,拦截器基于反射机制,动态代理实现的。 -
2.适用范围
过滤器依赖Tomcat等容器,因为这个接口是在Servlet规范中定义,只能在Web程序中使用。
拦截器是Spring的一个组件,并由Spring容器管理,不依赖Tomcat等容器,应用范围广,在Web,Application,等中可使用。 -
3.触发时间
过滤器是进入容器后,进servlet之前进行预处理,servlet之后请求结束。
拦截器是进入servlet之后,controller之前进行预处理,controller渲染视图后请求结束。 -
4.拦截范围
过滤器对几乎所有进入容器的请求起作用,拦截器只对controller或static目录下资源请求起作用。