联系方式    |    在线留言 您好,欢迎访问这里是半岛电竞官网!

半岛电竞

客服热线400-123-4567
半岛动态

半岛电竞过滤器 和 6个区别别再傻傻分不清了

作者:小编    发布时间:2023-08-09 18:13:46    浏览量:

  周末有个小伙伴加我微信,向我请教了一个问题:老哥,过滤器 (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()方法便是在其中调用的。

  我相信大部分人都能熟练使用滤器和,但两者的差别还是需要多了解下,不然开发中使用不当,时不时就会出现奇奇怪怪的问题,以上内容比较简单,新手学习老鸟复习,有遗漏的地方还望大家积极补充,如有理解错误之处,还望不吝赐教。半岛电竞半岛电竞半岛电竞半岛电竞

新闻推荐

友情链接:

在线客服 : 服务热线:400-123-4567 电子邮箱: admin@yuandiedu.com

公司地址:广东省广州市天河区半岛电竞88号

半岛电竞有限公司隶属于中国正规体育竞技平台、五大联赛、世界杯、欧冠、亚冠、中超、NBA、CBA、综合体育等以客户为中心,以市场为导向,致力于打造中国最...

Copyright © 2018-2023 半岛电竞(中国)官方app下载 版权所有  xml地图  网站地图