一.相遇
拦截器与过滤器。这两个词放在一起给人一种迷惑的感觉,感觉就像哥俩,相似但是仔细想想却又好像有什么不同。
我们想从名字入手
1.过滤器(Filter):这个词最直接的印象就是漏斗。没错,它的应用场景也多是进行过滤,无论是对数据,对请求的过滤都是可以用过滤器来进行,我们可以通过它来过修改字符编码集,过滤低俗文字危险字符等。
2.拦截器(Interceptor):拦截器就像一张网,通过拦截器,可以在方法的前后放置一个"网",在执行方法前调用方法,在执行方法后调用方法。
二.相识
1.过滤器:它是基于函数的回调,依赖servelet容器。如何理解基于函数回调这句话呢,最明显的一个例子,我们在编写过滤器的时候需要调用 filterChain.doFilter(servletRequest,servletResponse);
,这就是我对于基于函数回调这句话的理解,用户端发起请求后到达ApplicationFilterChain,调用第一个过滤器,依次调用doFilter,一个个的filter就像一条链子上的节点也像一个个漏斗,随后进入servlet。
2.拦截器:拦截器依赖于web框架,基于java反射机制。拦截器基于java反射机制,用到JDK的动态代理来实现,这样即可实现在执行方法前后调用方法。至于动态代理是什么呢?让我们仰望大神吧。动态代理
三、相知
让我们来坐下总结:
1.拦截器基于反射,过滤器基于函数回调
2.过滤器在一次请求中只会被调用一次,而拦截器则可能被调用多次
3.拦截器可以获取各种bean,可以调用业务;而过滤器则不行。
4.拦截器是在进入servlet之前或出servlet之后起作用,而过滤器则是进servlet后出servlet前。
于是呢我们便可以得到这样一张图

至此本篇结束,有说的不对的地方或者什么意见希望大家可以提出来,我们一起探讨,私信也可以,期待大家的评论和赞
网友评论