框架开发之----过滤器

学习Java过滤器的目的

之所以学java过滤器,是因为最近做开发遇到了用户登录校验的问题.

就去了解了一下,后来发现在实际应用中,过滤器并不是最好的实现登录检验的方法,而拦截器才是,在下一篇文章中,将讲到拦截器.

什么是过滤器

白话说:

在我看来,用嘴通俗的话来讲,就是”在服务器与客户端之间有一个安检”

在客户端向服务器发送请求的时候,”安检”需要检查一下请求是否”合法”,而且”安检”也有权利对这个请求进行修改.相同,在服务器给客户端响应的时候”安检”也需要检查一下. 这个安检就是我们说的”过滤器”.

专业术语解释:

 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务

 

过滤器的生命周期:

仔细研究会发现,过滤器的生命周期与servlet非常的相似

init方法:容器在创建当前过滤器的时候自动调用;

 public void init (FilterConfig filterConfig) 

当使用servlet过滤器时,web容器会调用init方法.而且在过滤器的整个生命周期中,有且只有一次调用.

destroy方法:容器在销毁当前过滤器的时候自动调用

一旦doFilterO方法里的所有线程退出或已超时,容器调用此方法。服务器调用destoryO以指出过滤器已结束服务,用于释放过滤器占用的资源。

doFilter方法:过滤器的主要代码写在这个地方

这是整个过滤器最重要的方法,所有过滤内容的实现都在这里.

doFilter方 法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。过滤器通过传送至此方法的FilterChain参数,调用chain.doFilterO将控制权传送给下一个过滤器。

当这个调用返回后,过滤器可以在它的 Filter方法的最后对响应做些其他的工作。如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilterO方法时,将运行最初请求的Servlet。

当有多个过滤器过滤一个请求时

之前有说:当请求符合过滤器的要求时,就会被放入到过滤器中,进行”过滤”,那么当有多个过滤器过滤同一个请求的时候,是怎么样的呢?

执行的顺序就如上图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。

 

执行请求的资源

可能说按顺序执行代码比较好理解,那么,什么叫”执行请求资源”呢

    通常我们所访问的资源是一个servlet或jsp页面,而jsp其实是一个被封装了的servlet,于是我们就可以统一地认为我们每次访问的都是一个Servlet.

而每当我们访问一个servlet时,web容器都会调用该Servlet的service方法去处理请求。而在service方法又会根据请求方式的不同(Get/Post)去调用相应的doGet()或doPost()方法,实际处理请求的就是这个doGet或doPost方法。写过servlet的朋友都应该知道,我们在doGet(或doPost)方法中是通过response.getWriter()得到客户端的输出流对象,然后用此对象对客户进行响应。

所以结合之前所说的,我们就了解了过滤器的执行流程了:

    执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值