filter过滤器_Java三大器之过滤器

过滤器这个东西在java程序中真的用的非常多,前面那篇文章说了,我需要写一个登录的功能,具体的效果也说的很清楚,但是前面说的是通过前端端架vue的一个钩子函数来实现,但是我们后端也需要进行限制才行,不然只靠前端是很难完全实现那个效果的,而且如果只靠前端也很不安全。所以过滤器成为了功能实现的首选。

当然了,过滤器也不只是是了实现我们的那个登录效果,同时也能使我们在玩我们程序的时候遵循我们自己的规则。

比如说,我们在访问我们的某个资源的时候需要一些凭证,这个资源就是我们页面、数据、操作等等。所谓的凭证呢,在这里就是我们的登录认证,如果在你需要访问某个资源的时候,我们的程序会通过我们写的代码来判断你是否登录了,如果你没有登录,不好意思,你没有资格看。

好了,前面说了我们需要实现我们的效果,现在来说一下为什么需要用过滤器:

2b0ecf4786eb247539dd14e43fc6d111.png

使用这个图我们可以很好的理解为啥需要使用了,如果我们不控制好我们的资源,那不论什么人都可以访问我们的页面,那是非常不爽的,至少我感觉是这样的,但是我们也不可能为每个单独的资源去编写一些程序,比如说,我们单独的为图片这个资源设置一些访问条件,然后后面又有其他资源了,我们又为其他资源单独的区写一些设置条件,那是很麻烦的,那怎么办,这个时候我们就想要一个一次编写,长久有效的东西,那这个东西就是过滤器了。

在这里简单的说一下这个过滤器的原理:

当我们在web.xml中注册了一个过滤器后,这个过滤器就成了servlet与tomcat交互的一道关卡,这个关卡就像我们的房屋的门一样,我们每个人进入这个房间都需要通过这道门。这个过滤器就相当于是这道门。这个过滤器可以对tomcat容器发送给servlet程序的每个请求进行拦截处理,通过也能对serlvet对tomcat容器的每个响应进行处理。

每个web应用程序可以注册多个Filter,每个Filter可以对一个或者一组多个servlet进行拦截

若有多个 Filter 程序对某个 Servlet 程序的访问进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。

这里说一下这个Filter链,其实不是什么好高大上的东西,理解为多个过滤器链接在一起的就行了,就像我们去面试时一样的,我们面试分为一面,二面,甚至三面,只有一面二面三面你都过了,你才可以去上班成为公司的员工。这个就是Filter链。

使用过滤器的步骤:

创建一个类

实现Filter

在web.xml中注册

下面是Filter容器的简单的实现hellword:

这里我们创建一个类,并实现Filter

3263ae24697191e81a060f2f9a1cb166.png

我们在web.xml文件中注册

5237dcc6f1cd62456c04637145be03e0.png

这样写好以后,我们完整的过滤器就写好了。

下面来说一下过滤器的生命周期:

我们可以看到,在我们实现Filter以后,我们需要实现三个方法,分别是init、doFilter、destroy。分别的意思是初始化、过滤器要做的事情、销毁。这样我们就很好理解过滤器的生命周期了。

当服务器启动的时候,过滤器被初始化,执行init方法,输出“初始化过滤器”,(这个方法只会调用一次,这个地方说明了过滤器也是单线程的)

当服务器发送轻松,通过过滤器,过滤器收到请求,调用doFilter方法,输出“doFilter方法”。当程序停止或者出现错误的时候调养destroy方法进行对过滤器的销毁。

既然我们把程序放在doFilter里面来了,那我们怎么把他放出来呢,就像我们进房间一样,我们总不可能一直呆在房间里面吧。

放行程序请求:

这里的放行并不是过滤器不管用,而是经过过滤器处理以后,我们让那个请求正常执行,就像我们通过房屋的门进入房间以后,换了一身衣服在出来的道理是一样的。我们只需要在dofilter中调用chain.doFilter(request,response)即可放行我们前面拦截的请求。

过滤器的执行原理:在 doFilter 执行之前,由容器将 filterChain 对象传入方法。调用此对象的.doFilter()方法可以将请求放行,实际上是执行过滤器链中的下一个 doFilter 方法,但是如果只有一个过滤器,则为放行。

好了,过滤器的主要内容说的差不多了

现在我们最后来总结一下,我们的过滤器过滤的资源方式:

1、精准匹配

例如:/index.jsp  /user/context 表示请求在访问/inde.jsp  /user/context资源的时候过滤拦截

2、路径匹配

/user/* 表示只要是user下拉的路径都会被拦截,比如user/login 、user/id/add 等等

3、扩展匹配

/*.jsp   /*.html 表示只要是以jsp或者html结尾的所有资源都会被过滤处理

好了,今天的内容分享到这里,这是是记录我java程序life的地方,故事很长,我们慢慢体味。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值