一、拦截器和过滤器实现原理不同:
过滤器基于函数回调的,拦截器是基于java反射机制(动态代理)的。
二、使用范围不同:
过滤器实现的是javax.servlet.Filter接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter的使用要依赖于tomcat等容器,导致它只能在web程序中使用。
而拦截器(Interceptor)是一个Spring组件,并由Spring容器管理,并不依赖tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
三、触发时机不同
过滤器和拦截器的触发机制也不同,
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完之后。
拦截器Interceptor是在请求进入servlet后,在进入controller之前预处理的,controller中渲染了对应的试图之后请求结束。
四、拦截的请求范围不同
执行顺序:Filter处理中->Interceptor前置->我是controller->Interceptor处理中->Interceptor处理后->Filter处理中
过滤器Filter执行了两次,拦截器Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用,
而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。
五、注入Bean情况不同
在实际的业务场景中,应用到过滤器或拦截器,为处理业务逻辑难免引入一些service服务。
六、控制执行顺序不同。
实际开发过程中,会出现多个过滤器或拦截器同时存在的情况。
过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小优先级越高。
拦截器preHandle()方法先执行,而postHandle()方法反而会后执行。