一.过滤器:
过滤器配置比较简单,实现filter接口即可,也可以通过@WebFilter接口注解,对特定url进行拦截,接口中定义了三个方法
1.init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。
2.doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。
3.destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次
二.拦截器
一个应用中可能存在多个拦截器,链式调用,一个请求也可以触发多个拦截器,每个拦截器的执行顺序会依据声明顺序执行
请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法
1.preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。
2.postHandle():只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。
3.afterCompletion():只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。
三.过滤器和拦截器都实现了AOP编程思想,都可以实现日志记录,登录权限等功能
四。不同点
1.过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。
2.使用范围不同,过滤器只能在web程序中使用(tomcat),而拦截器是spring一个组件,不依赖tomcat,不仅能用在web程序,也可以用在Application,Swing中
3.触发时机不同,过滤器是在请求进入容器之后servlet之前执行的,而且在servlet执完之后 ,执行的,拦截器是在请求进入servlet之后在conller之前执行的,Controller渲染视图之后请求结束
4.注入bean情况不同
5.控制执行顺序不同,开发过程中,会出现多个拦截器的情况,有时会希望某一个优先执行,
过滤器用@Order注解控制执行顺序,值越小级别越高优先执行,拦截器按照声明顺序执行