首先,我们明确的一点是:过滤器(Filter)是Servlet中的概念,拦截器(Interceptor)是Spring Mvc中的概念。
它们都能够实现权限认证、日志记录等功能。那么它们具体有什么不同?
-
Filter依赖于Servlet容器,在实现上基于函数回调。Interceptor依赖于SpringMvc框架,在实现上基于Java反射机制。
-
Filter可以对几乎所有请求都起作用。Interceptor只能对Controller请求进行拦截,对其他的请求(比如直接访问静态资源的请求)没办法进行拦截处理
-
Interceptor可以获取IoC容器中的各个bean,而Filter不行。在拦截器中注入一个service,可以调用业务逻辑。
拦截器和过滤器的触发时间不同
Filter是在请求进入容器后,但在请求进入servlet之前进行预处理的。在servlet的service方法执行后,但在返回给前端之前进行后置处理。(其实就是在doFilter方法中处理)
Interceptor是在请求进入容器,且请求进入servlet之后触发的。(不清楚为什么的话,就去看看SpringMvc的执行原理)
下面这张图可以看清过滤器和拦截器一起使用的时候,它们方法之间的执行顺序