过滤器(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()居然是相反的!如果实际开发中严格要求执行顺序,那就需要特别注意这一点。
半岛电竞网站半岛电竞网站半岛电竞网站其实在今年5月,我们一家搬到了新小区住,到现在正好快六个月了。为了日常饮水方便,我...
振动压实技术的首创品牌,戴纳派克始终致力于将最新的前沿技术应用于一代又一代的高科技压实产品。近日,戴纳派克又一重量级新...
流放之路过滤器可以帮助过滤器网站和应用程序免受垃圾邮件,恶意软件和恶意活动的影响。可以通过以下步骤使用这个过滤器:1....
参展首届进博会,武田制药只是一家中等体量的跨国制药企业,如今已跻身跨国药企在华业绩前十行列,累计在华投资超过30亿元;...
半岛电竞下载半岛电竞下载在无尽的黑暗中,闪烁着亿万颗璀璨的星辰,它们如同浩瀚的诗篇,诉说着宇宙的神秘与辽阔。作为人类,...
半岛电竞下载立冬已至,寒意渐浓。温馨提示,冬季低温易损坏卫浴设施,如家中无人,需对产品进行排水及保暖处理。 如产品内...