拦截器和过滤器
Filter的使用
首先,要使用Filter,必须实现javax.servlet.Filter接口:
init和destroy是default方法,实现类可以不用实现。doFilter必须实现,也就是说,作为一个过滤器,doFilter必须要定义。doFlilter方法中传进来的FilterChain对象用来调用下一个过滤器。拦截器的使用
过滤器与拦截器到底有啥区别呢?
一、实现原理不同
过滤器的实现基于回调函数拦截器基于Java的反射机制【动态代理】实现。二、使用范围不同
过滤器是Servlet的规范,需要实现javax.servlet.Filter接口,Filter使用需要依赖于Tomcat等容器。拦截器是Spring组件,定义在org.springframework.web.servlet包下,由Spring容器管理【又有更加丰富的生缪那个周期处理方法,细粒度,且能够使用Spring中的资源】,不依赖Tomcat等容器。三、触发时机不同
这一段在HandlerInterceptor类的注释上可以发现,两者的触发时机是不同的:
过滤器:对请求在进入后Servlet之前或之后进行处理。拦截器:对请求在handler【Controller】前后进行处理。
四、执行顺序不同
同时配置了过滤器和拦截器的情形:
过滤器的顺序每一次都将chain对象传入,达到最后接口回调的效果:
拦截器的顺序preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1
preHandle按照注册顺序,后两个与注册顺序相反。
一个拦截器的preHandle为false,则之后的所有拦截器都不会执行。一个拦截器的preHandle为true,则这个拦截器的triggerAfterCompletion一定会执行。只有所有的拦截器preHandler都为true,也就是正常执行,postHandle才会执行。
五、控制执行顺序方式不同
两者默认都是使用注册顺序,如果想要认为控制执行的顺序,方式略有不同:
过滤器如果想要强制改变,可以使用@Order注解。拦截器如果使用order()方法
总结