学习和使用Spring这么久了,我们都用过过滤器和拦截器,但是真要被问到过滤器和拦截器有什么区别,我又一脸懵逼了,回答不上来。今天我们就来学习一下,过滤器和拦截器。
过滤器
通过实现javax.servlet.Filter接口来自定义过滤器,可以通过@WebFilter注解过滤特定的URL。是Servlet层面的定义。Filter接口定义了三个方法:
init():方法在容器启动过程中初始化过滤器时被调用,在Filter的整个生命中之后被调用一次。
doFilter():容器中的每一次请求都会调用该方法,FilterChain是调用过滤器链上的下一个过滤器。
destroy():当容器销毁时会被调用,在Filter的整个生命中之后被调用一次。
拦截器
通过实现org.springframework.web.servlet.HandlerInterceptor接口来自定义拦截器。是SpringMvc层面的定义。HandlerInterceptor同样定义了三个方法:
preHandle():方法会在请求之前被调用,如果方法返回false,将视为当前请求被拦截,后续拦截器不会被执行。
postHandle():方法会在请求方法调用之后返回结果之前被调用。由于拦截器是个环,会以执行preHandle方法的相反顺序执行postHandle方法。
afterCompletion():方法会在请求返回结果的时候被调用。
一、调用时机不同
Filter调用在Servlet之前,Interceptor调用在Servlet之后。
Filter.doFilter方法参数ServletRequest和ServletResponse。是Request和Response的基类,只能获取最基本的参数。
Interceptor的方法参数HttpServletRequest和HttpServletResponse是经过DispatcherServlet处理过的
二、实现原理不同
Filter是基于回调实现的,Interceptor是基于反射实现的。
我们声明的Filter都有一个参数拦截器链FilterChain,Filter处理完成之后,去调用回调方法chain.doFilter。
Interceptor是依赖Spring一贯的反射机制来实现的。
三、定义域不同
Filter由Servlet规范中定义的,而Interceptor是SpringMvc框架的组件。
四、覆盖范围不同
Filter可以过滤项目的所有请求,Options请求,静态资源请求;而Interceptor只能覆盖SpringMvc的接口。
五、控制调用顺序的方式不同
Filter的调用顺序可以使用@Order注释改变,Interceptor的调用顺序是根据配置的顺序来的。