SspringMvc(或Springboot)中的过滤器是基于web开发JavaEE标准,先于所有servlet执行的一种起过滤作用的技术;拦截器是基于Spring容器的,不仅适用于web开发,也可用于application、swing程序的一种拦截技术。
它们之间至少有以下区别:
1.拦截器基于Java反射机制,过滤器基于函数回调;
2.拦截器在每一次请求可以多次调用,过滤器伴随web容器的创建和销毁分别进行一次init和destroy,在每一次请求仅进行一次调用;
对于1,反射机制这里不做探究,而函数回调我是这样理解的:
对于2,这里多次调用和一次调用指的是方法调用:
对于每次请求,过滤器只执行dofilter():
拦截器针对不同时机—— 进入handler之前执行preHandle() , 在handler内部但还未返回ModelAndView执行postHandle() , 返回了ModelAndView但还未回调到filter执行afterCompletion() ,这里以登录成功举例说明:
补充:另外,我看到很多文章说拦截器拦截不到静态资源请求,而过滤器可以。但经测试,两者都可以拦截,不管是否静态资源。能不能拦截只取决于你的配置:
这里的拦截器可以拦截除css,js,img文件夹外的所有:
这里的过滤器可以拦截所有:



