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

半岛电竞

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

请半岛电竞教一下关于过滤器具体应用上的区别?

作者:小编    发布时间:2023-07-24 01:07:54    浏览量:

  过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。

  (Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是做的事情。

  (Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到。

  设计模式的命名都跟真实的场景有密切相关性,只要理解了命名,就理解了模式。题主在网上搜到的东西都是关于模式在Struts中的具体实现,虽然它们的确都在Struts中很常用,然而然而跟action、反射没有半毛钱关系,甚至跟Java都没有关系。不过显然题主对Java比较熟悉,碰巧我也比较熟悉Java,那不妨以Java举例:

  在真实使用中,很多人,不管是新手还是老手会犯的一个错误是,在不该改变对象状态的时候强制改变它,或者在应该传入只读参数时传入了可变参数。

  上面的例子中,Filter的例子是JDK提供的函数,如果你在这里改变了对象的状态(当然例子里的String类型本来就不可以改变),就违背了filter的约定。

  同样的,在Listener中不管是传入了可变的对象,或是对该对象进行了修改,都是违背设计模式约定的做法,会给其他读代码的人造成困扰。

  而Interceptor几乎可以对流程做任何事情,所以没有什么特别要注意的地方,用这一类接口的时候仔细读文档,设计这一类接口的时候仔细写文档吧。

  我们很容易发现,过滤器可以比喻成一张滤网。我们想想现实中的滤网可以做什么:在泡茶的时候,过滤掉茶叶。那滤网是怎么过滤茶叶的呢?规定大小的网孔,只要网孔比茶叶小,就可以实现过滤了!

  引申在Web容器中,过滤器可以做:过滤一些敏感的字符串【规定不能出现敏感字符串】、避免中文乱码【规定Web资源都使用UTF-8编码】、权限验证等等等,过滤器的作用非常大,只要发挥想象就可以有意想不到的效果

  「学某项技术之前,首先要知道它能干什么,学了这项技术有什么好处,再细学」

  知道了什么是过滤器以后,其实我们学的东西就不是很多了,感觉花半天就能学完了。

  首先,我们来认识一下Filter接口和相对应的doFilter()方法以及它的参数。

  我们可以这样理解:过滤器不单单只有一个,那么我们怎么管理这些过滤器呢?在Java中就使用了链式结构。把所有的过滤器都放在FilterChain里边,如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。

  上面的话好像有点拗口,我们可以想象生活的例子:现在我想在茶杯上能过滤出石头和茶叶出来。石头在一层,茶叶在一层。所以茶杯的过滤装置应该有两层滤网。这个过滤装置就是FilterChain,过滤石头的滤网和过滤茶叶的滤网就是Filter。在石头滤网中,茶叶是属于下一层的,就把茶叶放行,让茶叶的滤网过滤茶叶。过滤完茶叶了,剩下的就是茶

  对上面的API了解完了以后,我们试着自己写一个过滤器(实际上就是实现Filter接口,重写doFilter()方法),然后以注解/xml配置的方式来部署自己的过滤器。

  随后看一下FilterChain的执行顺序是不是自己配置的那样,再写几个常见的过滤器应用就好了,比如说「禁止浏览器缓存」「实现自动登录」「编码过滤器」「敏感词过滤器」「压缩资源过滤器」「HTML转义过滤器」「缓存数据」...

  三歪在工作时间不长哈,接触了好多些系统,由我们自己去写「过滤器」的场景还是不多的。但我觉得有一点可以好好学学,就是「责任链模式」。

  之前为啥我写了一篇「责任链模式」,其实就是这个设计模式在系统中用得挺多的,号称能搞掂if else。

  过滤器其实也是责任链模式的一种实现,FilterChain层层往下执行,直到最后没有过滤器过滤器,就到了「目标资源」

  就是一个实现特定接口的普通Java程序,这个程序专门用于监听一个Java对象的方法调用或属性改变,当被监听对象发生上述事件后,某个方法将立即被执行。

  上面这句话应该也很好理解,比如说我有一个SanWai对象,里边有一个eat()方法。每当SanWai.eat()的时候,我的可以监听到SanWai.eat()被调用了,于是我们就可以搞一波逻辑,做别的事了。

  回到Servlet层面上,我们更多的监听的是「Session」「Request」「ServletContext」这几个对象的创建/销毁/属性内的变化。

  针对监听上面的几个对象,我们可以做出一些小例子,比如说「统计网站的在线人数」「自动踢人」「定时清除Session的值」

  在写业务代码的时候,同样也用得不多,我几乎没怎么写过的代码。

  但是理解这个概念我觉得还是很有必要的。以我的理解,大概可以认为「A发生了变化,B需要依赖A发生的变化做出处理」,这就是。

  和过滤器在工作中可能让我们自己「手写」的概率不是很大,但我觉得这两个技术还是需要了解的。如果你了解过Struts2,你就会发现Struts2就是用的过滤器来实现很多的功能。在Spring源码里边也有很多的实现,我觉得都可以看看。

  过滤器和还是需要理解它的思想,这块对我们学习Spring也是很有帮助的。

  现在已经工作有一段时间了,为什么还来写过滤器和呢,原因有以下几个:

  有追求的人,如果早期关注我的同学可能会发现,我的GitHub、文章导航的

  会经常更换。现在的GitHub导航也不合我心意了(太长了),并且早期的文章,说实话排版也不太行,我决定重新搞一波。

  我的文章会分发好几个平台,但文章发完了可能就没人看了,并且图床很可能因为平台的防盗链就挂掉了。又因为有很多的读者问我:”

  我写过很多系列级的文章,这些文章就几乎不会有太大的改动了,就非常适合把它们给”

  基于上面的原因,我决定把我的系列文章汇总成一个PDF/HTML/WORD/epub文档。说实话,打造这么一个文档花了我不少的时间。

  ) 和 (Interceptor) 有啥区别啊?听到题目我的第一感觉就是:简单!毕竟这两种工具开发中用到的频率都相当高,应用起来也是比较简单的,可当我准备回复他的时候,竟然不知道从哪说起,支支吾吾了半天,场面炒鸡尴尬有木有半岛电竞,工作这么久一个基础问题答成这样,丢了大人了。

  @WebFilter注解实现对特定URL拦截,看到Filter接口中定义了三个方法。

  首先编写一个简单的处理类,请求的拦截是通过HandlerInterceptor

  则是基于Java的反射机制(动态代理)实现的。这里重点说下过滤器!

  Servlet规范中定义的,也就是说过滤器Filter的使用要依赖于Tomcat等容器半岛电竞,导致它只能在web程序中使用。>

  Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。>

  servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束。4、拦截的请求范围不同

  Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的半岛电竞请求起作用,而只会对Controller中请求或访问static目录下的资源请求起作用。5、注入Bean情况不同

  springcontext之前,而Bean又是由spring进行管理。:老子今天要进洞房; Spring:兄弟别闹,你媳半岛电竞妇我还没生出来呢!

  preHandle()居然是相反的!如果实际开发中严格要求执行顺序,那就需要特别注意这一点。

新闻推荐

友情链接:

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

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

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

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