毕竟这两种工具开发中用到的频率都相当高,应用起来也是比较简单的,可当我准备回复他的时候,竟然不知道从哪说起,支支吾吾了半天,场面炒鸡尴尬有木有,工作这么久一个基础问题答成这样,丢了大人了。平时觉得简单的知识点,但通常都不会太关注细节,一旦被别人问起来,反倒说不出个所以然来。
归根结底,还是对这些知识了解的不够,一直停留在会用的阶段,以至于现在一看就会一说就废!这是典型基础不扎实的表现,哎·~,其实我也就是个虚胖!
过滤器的配置比较简单,直接实现Filter接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter接口中定义了三个方法。
init():该方法在容器启动初始化过滤器时被调用,它在Filter的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。
doFilter():容器中的每一次请求都会调用该方法,FilterChain用来调用下一个过滤器Filter。
destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器Filter的整个生命周期也只会被调用一次
拦截器它是链式调用,一个应用中可以同时存在多个拦截器Interceptor, 一个请求也可以触发多个拦截器 ,而每个拦截器的调用会依据它的声明顺序依次执行。
首先编写一个简单的拦截器处理类,请求的拦截是通过HandlerInterceptor来实现,看到HandlerInterceptor接口中也定义了三个方法。
preHandle():这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。
过滤器 和 拦截器 均体现了AOP的编程思想,都可以实现诸如日志记录、登录鉴权等功能,但二者的不同点也是比较多的,接下来一一说明。
过滤器和拦截器 底层实现方式大不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。
在我们自定义的过滤器中都会实现一个doFilter()方法,这个方法有一个FilterChain参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个doFilter()方法就是回调方法。
我们看到过滤器 实现的是javax.servlet.Filter接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器Interceptor是在请求进入servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束。
在上边我们已经同时配置了过滤器和拦截器,再建一个Controller接收请求测试一下。
项目启动过程中发现,过滤器的init()方法,随着容器的启动进行了初始化。此时浏览器发送请求,F12 看到居然有两个请求,一个是我们自定义的Controller请求,另一个是访问静态图标资源的请求。看到控制台的打印日志如下:
过滤器Filter执行了两次,拦截器Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。
在实际的业务场景中,应用到过滤器或拦截器,为处理业务逻辑难免会引入一些service服务。
过滤器中注入service,发起请求测试一下 ,日志正常打印出“我是方法A”。
在拦截器中注入service,发起请求测试一下 ,竟然TM的报错了,debug跟一下发现注入的service怎么是Null啊?这是因为加载顺序导致的问题,拦截器加载的时间点在springcontext之前,而Bean又是由spring进行管理。
拦截器:老子今天要进洞房; Spring:兄弟别闹,你媳妇我还没生出来呢!
实际开发过程中,会出现多个过滤器或拦截器同时存在的情况,不过,有时我们希望某个过滤器或拦截器能优先执行,就涉及到它们的执行顺序。
过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。
拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
看到输出结果发现,先声明的拦截器preHandle()方法先执行,而postHandle()方法反而会后执行。
postHandle()方法被调用的顺序跟preHandle()居然是相反的!如果实际开发中严格要求执行顺序,那就需要特别注意这一点。
那为什么会这样呢?得到答案就只能看源码了,我们要知道controller中所有的请求都要经过核心组件DispatcherServlet路由,都会执行它的doDispatch()方法,而拦截器postHandle()、preHandle()方法便是在其中调用的。
发现两个方法中在调用拦截器数组HandlerInterceptor[]时,循环的顺序竟然是相反的。。。,导致postHandle()、preHandle()方法执行的顺序相反。
我相信大部分人都能熟练使用滤器和拦截器,但两者的差别还是需要多了解下,不然开发中使用不当,时不时就会出现奇奇怪怪的问题,以上内容比较简单,新手学习老鸟复习,有遗漏的地方还望大家积极补充,如有理解错误之处,还望不吝赐教。
整理了几百本各类技术电子书,送给小伙伴们。关注公号回复【666】自行领取。和一些小伙伴们建了一个技术交流群,一起探讨技术、分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧!
无论你是刚入行、还是已经有几年经验的程序员,相信这份面试提纲都会给你不少助力,长按二维码关注 『 程序员内点事 』 ,回复 『 offer 』 自行领取,祝大家 offer 拿到手软
开源 Ruoyi-Flex 发布新版 V5.1.0,三端齐发,恭贺春节
Bee+SpringBoot 稳定的 Sharding、Mongodb ORM 功能(同步 Maven)
赫兹跳动 v1.5.0 发布,Status Page 构建能力,祝大家新年快乐!
Java 【wu-lazy-cloud-network】1.2.2-JDK17-SNAPSHOT发布
计划任务功能优化,应用商店上架软件超过 100 款,1Panel 开源面板 v1.9.6 发布
Dante OSS v3.1.8.3 已经发布,简化 Minio 操作
:tada::tada: wmproxy 0.2.7 发布,用 rust 仿 nginx 实现,多端口地址监听
安防视频监控平台EasyNVR使用rtsp流接入显示无法播放是什么原因?
GPT-4「变懒」问题将被修复;英伟达选择越南成公司“第二故乡”丨 RTE 开发者日报 Vol.104
视频集中存储EasyCVR平台使用海康SDK,播放出现串流情况是什么原因?
【议程发布】10月上海线下培训:RT-Thread × 瑞萨 工业监视器+HMI解决方案!
云原生周刊:Gateway API 1.0.0 发布 2023.11.6
视频云存储/安防监控/AI分析/视频AI智能分析网关:垃圾满溢AI算法
11月10日!SIG组开放工作会议亮点&社区优秀贡献者评选细则抢先看!
打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态
全面拥抱 K8s,ApacheDolphinScheduler 应用与支持 K8s 任务的探索
openEuler Summit 2023 欢迎参加SIG组开放工作会议
HarmonyOS:Neural Network Runtime对接AI推理框架开发指导
英特尔锐炫显卡DX11性能更新,并推出全新英特尔PresentMon Beta
仿人脑超算“深南”即将面世,突破摩尔定律;ChatGPT 变笨有了新解释丨 RTE 开发者日报 Vol.117
安防监控EasyCVR视频汇聚平台使用海康SDK播放出现花屏是什么原因?
Apache DolphinScheduler 官方发布3.2.0版本!大数据调度【重磅更新】
RAG (检索增强生成)技术详解:揭秘基于垂直领域专有数据的Chatbots是如何实现的
3.2.0 版本预告!远程日志解决 Worker 故障获取不到日志的问题
视频直播点播平台EasyDSS调用接口后,录像回看无法打开是什么原因?
国标GB28181设备注册安防监控平台EasyCVR不上线是什么原因?
openGauss DataPod资源池化技术获“金融科技产业联盟2023年十佳课题”
安防视频监控/云存储平台EasyCVR平台无法取消共享通道该如何解决?
马斯克警告威胁,奥特曼自请监管,小扎呼吁开源丨RTE开发者日报 Vol.49
天翼云亮相操作系统大会&openEuler Summit 2023,斩获五项大奖!
openGauss亮相1024程序员节,深度解读openGauss 5.1.0版本
个人观点,作者发这么长的文章,《之所以不提供旧文档的阅读及旧版本的维护,是因为 ioGame 开源作者将精力放到了最新的 ioGame 版本上,并提供了与之对应版本的在线文档阅读(不需要登录,没有辣眼的广告,可阅读所有文档)》就这一句话可以看,焦点本来就是老文档收费,但是又发长文说半天其他的,很没有意思,其他的本来就什么人攻击,老文档如果不更新了也没啥要继续维护的吧,gitee开个仓库挂上去就完了,非要来一个收费并且不得公开传播,
作为技术人员,还是需要有一定的职业素养的。虽然这些东西在技术上能实现,但滥用等同是对中国区技术人员的自污,并加深反感印象
李楠这么牛却把魅族搞没了,打口仗它可是第一,丢人不还有脸出来评论人家华为。至少人家华为是为了突破美国封锁自立更生,那孙子只会嘲讽别人,靠贬低打压别人,这就是某些国人的劣跟性,美舔太多!
要我说, 要玩商业就完完全全的搞闭源去吧, 别搅合开源的水了, 要卖钱就大大方方正大光明的卖钱, 跟adobe一样, 卖什么价有维护期多久都大大方方的写在官网上, 二进制编译包你随便下, 你买了给你一个授权码输入进去就行了, 搞什么开源, 我们井水不犯河水, 你别拿开源的幌子搞挂羊头卖狗肉
省流:只有高贵的MAC版本