周末有个小伙伴加我微信,向我请教了一个问题:老哥,过滤器 (Filter) 和 (Interceptor) 有啥区别啊? 听到题目我的第一感觉就是:简单!
毕竟这两种工具开发中用到的频率都相当高,应用起来也是比较简单的,可当我准备回复他的时候,竟然不知道从哪说起,支支吾吾了半天,场面炒鸡尴尬有木有,工作这么久一个基础问题答成这样,丢了大人了。
平时觉得简单的知识点,但通常都不会太关注细节,一旦被别人问起来,反倒说不出个所以然来。
归根结底,还是对这些知识了解的不够,一直停留在会用的阶段,以至于现在一看就会一说就废半岛电竞!这是典型基础不扎实的表现,哎·~,其实我也就是个虚胖!
过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法。
它是链式调用,一个应用中可以同时存在多个Interceptor, 一个请求也可以触发多个 ,而每个的调用会依据它的声明顺序依次执行。
首先编写一个简单的处理类,请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法。
过滤器 和 均体现了AOP的编程思想,都可以实现诸如日志记录、登录鉴权等功能,但二者的不同点也是比较多的,接下来一一说明。
过滤器和 底层实现方式大不相同,过滤器 是基于函数回调的, 则是基于Java的反射机制(动态代理)实现的。
在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。
我们看到过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。
而(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
在上边我们已经同时配置了过滤器和,再建一个Controller接收请求测试一下。
项目启动过程中发现,过滤器的init()方法,随着容器的启动进行了初始化。
此时浏览器发送请求,F12 看到居然有两个请求,一个是我们自定义的 Controller 请求,另一个是访问静态图标资源的请求。
过滤器Filter执行了两次,Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用,而只会对Controller中请求或访问static目录下的资源请求起作用。
在实际的业务场景中,应用到过滤器或过滤器,为处理业务逻辑难免会引入一些service服务。
过滤器中注入service,发起请求测试一下 ,日志正常打印出“我是方法A”。
在中注入service,发起请求测试一下 ,竟然TM的报错了,debug跟一下发现注入的service怎么是Null啊?
这是因为加载顺序导致的问题半岛电竞,加载的时间点在springcontext之前,而Bean又是由spring进行管理。
实际开发过程中,会出现多个过滤器或同时存在的情况,不过,有时我们希望某个过滤器或能优先执行,就涉及到它们的执行顺序。
过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。
默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
看到输出结果发现,先声明的 preHandle() 方法先执行,而postHandle()方法反而会后执行。
postHandle() 方法被调用的顺序跟 preHandle() 居然是相反的!如果实际开发中严格要求执行顺序,那就需要特别注意这一点。
那为什么会这样呢? 得到答案就只能看源码了,我们要知道controller 中所有的请求都要经过核心组件DispatcherServlet路由,都会执行它的 doDispatch() 方法,而postHandle()、preHandle()方法便是在其中调用的。
我相信大部分人都能熟练使用滤器和,但两者的差别还是需要多了解下,不然开发中使用不当,时不时就会出现奇奇怪怪的问题,以上内容比较简单,新手学习老鸟复习,有遗漏的地方还望大家积极补充,如有理解错误之处,还望不吝赐教。半岛电竞半岛电竞半岛电竞半岛电竞
半岛电竞网站半岛电竞网站半岛电竞网站其实在今年5月,我们一家搬到了新小区住,到现在正好快六个月了。为了日常饮水方便,我...
振动压实技术的首创品牌,戴纳派克始终致力于将最新的前沿技术应用于一代又一代的高科技压实产品。近日,戴纳派克又一重量级新...
流放之路过滤器可以帮助过滤器网站和应用程序免受垃圾邮件,恶意软件和恶意活动的影响。可以通过以下步骤使用这个过滤器:1....
参展首届进博会,武田制药只是一家中等体量的跨国制药企业,如今已跻身跨国药企在华业绩前十行列,累计在华投资超过30亿元;...
半岛电竞下载半岛电竞下载在无尽的黑暗中,闪烁着亿万颗璀璨的星辰,它们如同浩瀚的诗篇,诉说着宇宙的神秘与辽阔。作为人类,...
半岛电竞下载立冬已至,寒意渐浓。温馨提示,冬季低温易损坏卫浴设施,如家中无人,需对产品进行排水及保暖处理。 如产品内...