一个web APP应用程序可以注册多个Filter程序,每个Filter程序都可以对一个URL进行阻止。 如果多个过滤器程序阻止同一URL,则这些过滤器构成一个过滤器链(也称为过滤器链)。
Filter链由FilterChain对象表示,FilterChain对象具有doFilter ()方法。 此方法的作用是释放Filter链上的当前过滤器,并将请求移动到下一个Filter。
Filter链的拦截过程如图1所示。
! 过滤器链(/images/1610539363756.png '过滤器链() ) ) ) ) ) ) ) ) )。
图1过滤器链
在图1中,当浏览器访问Web服务中的资源时,必须通过两个过滤器Filter1和Filter2。 首先,Filter1阻止该请求,在Filter1中处理请求,然后调用Filter1的doFilter ()方法将请求传递给Filter2,在Filter2处理用户请求后也同样是doFilter () ) Web服务器响应此请求时,它会被过滤器阻止,但该块的顺序与以前相反,最终将响应结果发送到客户端浏览器。
为了帮助读者了解过滤器链的侦听过程和了解过滤器链的使用,我们将通过实例研究演示如何使用过滤器链侦听my servlet的同一请求。
#### 1)创建过滤器
在filterDemo01项目的com.mengma.filter包中创建新的两个过滤器MyFilter01和MyFilter02,如MyFilter01和MyFilter02所示。
# # # #
``````
package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
导入javax.servlet.filter;
导入javax.servlet.filter chain;
导入javax.servlet.filter config;
导入javax.servlet.servlet exception;
导入javax.servlet.servlet request;
导入javax.servlet.servlet response;
公共类myfilter 01 implements filter {
公共语音识别初始化(filterconfigfconfig ) throws ServletException { )。
//过滤器对象在初始化时被调用,可以设置一些初始化参数
}
publicvoiddofilter (servletrequestrequest,servlet响应响应,
filterchainchain (throwsioexception,ServletException { )。
//用于阻止用户的请求,如果匹配当前滤波器的块路径,则调用此方法
printwriter out=response.get writer (;
out.write(myfilter01
();
chain.dofilter(request,response );
}
公共语音目录
//在销毁时自动调用过滤器对象以释放资源
}
}
``````
#### MyFilter02
``````
package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
导入javax.servlet.filter;
导入javax.servlet.filter chain;
导入javax.servlet.filter config;
导入javax.servlet.servlet exception;
导入javax.servlet.servlet request;
导入javax.servlet.servlet response;
公共类myfilter 02实施过滤器{
公共语音识别初始化(filterconfigfconfig ) throws ServletException { )。
//过滤器对象在初始化时被调用,可以设置一些初始化参数
}
publicvoiddofilter (servletrequestrequest,servlet响应响应,
filterchainchain (throwsioexception,ServletException { )。
//用于阻止用户的请求,如果匹配当前滤波器的块路径,则调用此方法
printwriter out=response.get writer (;
out.write(myfilter02before
();
chain.dofilter(request,response );
out.write ('
MyFilter02 After
();
}
公共语音目录
//在销毁时自动调用过滤器对象以释放资源
}
}
``````
#### 2)修改web.xml
为了防止其他过滤器影响此过滤器链的演示效果,请注释掉web.xml文件中其他过滤器的配置信息,然后将MyFilter01和MyFilter02过滤器的映射信息添加到my serrer 具体情况如下。
``````
xmlns=' http://Java.sun.com/XML/ns/javaee ' xmlns 3360 web=' http://Java.sun.com/XML/ns/javaee/we B- app
xsi :方案定位=' http://Java.sun.com/XML/ns/javaee http://Java.sun.com/XML/ns/javaee/we B- app _ 3
version='3.0 '
MyFilter01
com.mengma.filter.MyFilter01
MyFilter01
/my servlet
MyFilter02
com.mengma.filter.MyFilter02
MyFilter02
/my servlet
我的servlet
com.Meng ma.filter.my servlet
我的servlet
/my servlet
``````
#### 3)运行项目,确认结果
启动Tomcat服务器,并在浏览器地址栏中输入http://localhost :8080/filter demo 01/my servlet。 此时,浏览器窗口中显示的结果如图2所示。
! 运行结果((/images/161053933262.png '运行结果) ) ) ) ) ) ) ) ) ) )。
图2运转结果
从图2可以看出,MyServlet首先被MyFilter01阻止,显示MyFilter01的内容,然后被MyFilter02阻止,浏览器在MyServlet在MyFilter02发布之前一直保持MyServlet
请注意,过滤器链中每个过滤器的拦截顺序与web.xml文件中`` 元素的映射顺序相匹配。 由于MyFilter01的“”元素位于MyFilter02的“”元素之前,因此用户的访问请求首先被拦截到MyFilter01,然后被拦截到MyFilter01