全站搜索
首页/天辰娱乐登录/注册平台
首页/天辰娱乐登录/注册平台
  • 天辰娱乐注册
  • 天辰娱乐登录
  • 天辰娱乐招商QQ
  • 过滤器 和 拦截器 6 个区别别再傻傻分不清了 - 程序员小富的个人空间 - OSCHINA
    作者:admin 发布于:2024-02-09 07:28 文字:【】【】【

      毕竟这两种工具开发中用到的频率都相当高,应用起来也是比较简单的,可当我准备回复他的时候,竟然不知道从哪说起,支支吾吾了半天,场面炒鸡尴尬有木有,工作这么久一个基础问题答成这样,丢了大人了。平时觉得简单的知识点,但通常都不会太关注细节,一旦被别人问起来,反倒说不出个所以然来。

      归根结底,还是对这些知识了解的不够,一直停留在会用的阶段,以至于现在一看就会一说就废!这是典型基础不扎实的表现,哎·~,其实我也就是个虚胖!

      过滤器的配置比较简单,直接实现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版本

    相关推荐
  • Spring拦截器和过滤器有什么区别
  • 过滤器 和 拦截器 6 个区别别再傻傻分不清了 - 程序员小富的个人空间 - OSCHIN
  • 一口气说出 过滤器 和 拦截器 6个区别别再傻傻分不清了
  • 过滤器与拦截器的具体区别
  • 详解SpringMVC的拦截器与异常处理机制
  • Spring拦截器和过滤器的区别在哪?
  • 怎么用setSendMessageListener方法拦截或监听所有发送消息
  • Google图片搜索新增内容过滤功能
  • 全自动不锈钢高压电动刮刀过滤器多少钱
  • UT Austin余桂华团队东北林大陈文帅团队:用于可持续水净化的生物基纳米纤维水
  • 脚注信息
    Copyright © 2026 首页/天辰娱乐登录/注册平台 TXT地图 HTML地图 XML地图