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