一、拦截器和过滤器实现原理不同:

过滤器基于函数回调的,拦截器是基于java反射机制(动态代理)的。


二、使用范围不同:

过滤器实现的是javax.servlet.Filter接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter的使用要依赖于tomcat等容器,导致它只能在web程序中使用。

而拦截器(Interceptor)是一个Spring组件,并由Spring容器管理,并不依赖tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。

三、触发时机不同

过滤器和拦截器的触发机制也不同,

Spring拦截器和过滤器的区别?_过滤器


过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完之后。

拦截器Interceptor是在请求进入servlet后,在进入controller之前预处理的,controller中渲染了对应的试图之后请求结束。

四、拦截的请求范围不同

执行顺序:Filter处理中->Interceptor前置->我是controller->Interceptor处理中->Interceptor处理后->Filter处理中

过滤器Filter执行了两次,拦截器Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用,

而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。

五、注入Bean情况不同

在实际的业务场景中,应用到过滤器或拦截器,为处理业务逻辑难免引入一些service服务。


六、控制执行顺序不同。

实际开发过程中,会出现多个过滤器或拦截器同时存在的情况。

过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小优先级越高。


拦截器preHandle()方法先执行,而postHandle()方法反而会后执行。