过滤器这个东西在java程序中真的用的非常多,前面那篇文章说了,我需要写一个登录的功能,具体的效果也说的很清楚,但是前面说的是通过前端端架vue的一个钩子函数来实现,但是我们后端也需要进行限制才行,不然只靠前端是很难完全实现那个效果的,而且如果只靠前端也很不安全。所以过滤器成为了功能实现的首选。
当然了,过滤器也不只是是了实现我们的那个登录效果,同时也能使我们在玩我们程序的时候遵循我们自己的规则。
比如说,我们在访问我们的某个资源的时候需要一些凭证,这个资源就是我们页面、数据、操作等等。所谓的凭证呢,在这里就是我们的登录认证,如果在你需要访问某个资源的时候,我们的程序会通过我们写的代码来判断你是否登录了,如果你没有登录,不好意思,你没有资格看。
好了,前面说了我们需要实现我们的效果,现在来说一下为什么需要用过滤器:
使用这个图我们可以很好的理解为啥需要使用了,如果我们不控制好我们的资源,那不论什么人都可以访问我们的页面,那是非常不爽的,至少我感觉是这样的,但是我们也不可能为每个单独的资源去编写一些程序,比如说,我们单独的为图片这个资源设置一些访问条件,然后后面又有其他资源了,我们又为其他资源单独的区写一些设置条件,那是很麻烦的,那怎么办,这个时候我们就想要一个一次编写,长久有效的东西,那这个东西就是过滤器了。
在这里简单的说一下这个过滤器的原理:
当我们在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
我们在web.xml文件中注册
这样写好以后,我们完整的过滤器就写好了。
下面来说一下过滤器的生命周期:
我们可以看到,在我们实现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的地方,故事很长,我们慢慢体味。