拦截器和过滤器

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()方法

总结

posted @ 2022-05-09 17:08  前度刘郎  阅读(80)  评论(0编辑  收藏  举报
欢迎来到戴建伟的博客!