首页 > 编程知识 正文

java过滤器的工作原理(java 过滤器调用链_FilterChain(过滤器链)详解)

时间:2023-05-05 05:27:59 阅读:123402 作者:35

一个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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。