1.使用时间不同:
首先过滤器和拦截器,它们都可以在请求的过程当中插入一手也可以进行拦腰截断,那他们的请求大概过程为,当一个请求进来,先交给Web 服务器提供的过滤器再来到servlet,那这个时候呢,就有一个叫做Dispatcherservlet 的servlet,它就会进行执行,在Dispatcherservlet 中,就会调用我们的拦截器,再由Dispatcherservlet 分发给对应的Controller来处理我们的请求,那请求处理完之后呢,就会从调用的链路原路返回,再回到拦截器,然后再回到过滤器,最终响应给客户端。
所以它们的区别呢: 就是过滤器,它先执行它是servlet的规范的一部分更接近于底层,它会在servlet 的请求之前和响应之后来进行处理。
那拦截器呢,它后执行,它是SpringMVC的一部分,更接近业务层,他会在Ctrl 请求之前和处理完毕之后进行处理。
2.实现原理不同
过滤器和拦截器层实现方式不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。
3.使用方式不同
过滤器需要依赖servlet的容器提供的Filter接口,多个过滤器会根据配置的顺序来决定它们的执行顺序。
而拦截器呢需要依赖Spingmvc 提供的的的Interceptor的接口,多个拦截器的执行顺序,由bean的配置顺序来决定,可以通过Order 注解来改变执行顺序。
4.用途不同
拦截器通常用来实现一些跟业务相关,不是必须的一些工作,类似身份认证与授权,还有接口的性能监控跨域处理日志记录的。
而过滤器呢,通常实现那些必要的基础设施工作,比如编码,处理啊,试图响应请求参数处理和Ui 重定向等等,所以呢,我们平常面向业务开发基本用不到过滤器用拦截器基本就已经满足我们的基本需求,而且拦截器天然集成Spring 可以直接把并自动装配进来,可以非常方便的执行业务处理。