您的位置:首页 > 编程语言 > Java开发

【转载】JavaWeb开发Servlet过滤器链执行顺序详解

2017-04-25 11:18 976 查看
过滤器链的执行顺序是服务器按照web.xml文件的配置先后顺序执行的,

而过滤器的加载是从后往前的顺序加载的。

先创建一个过滤器类FilterTest:
public class FilterTest implements Filter{

static{
System.out.println("------------static------------");
}

public FilterTest() {
System.out.println("***********FilterTest()******");
}

@Override
public void destroy() {
System.out.println("FilterTestDestroy()");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterTestStart---doFilter***");
chain.doFilter(request,response);
System.out.println("FilterTestEnd---doFilter***");
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterTestInit()");
}
}


在创建第二个过滤器类FilterDemo:
public class FilterDemo implements Filter{

static{
System.out.println("------------FilterDemoStatic------------");
}

public FilterDemo() {
System.out.println("***********FilterDemo()******");
}

@Override
public void destroy() {
System.out.println("FilterDestroy()-------");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterStart------doFilter()------");
chain.doFilter(request, response);
System.out.println("FilterEnd--------doFilter()-------");
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterInit()");
}

}


在这两个类中定义的静态方法块,构造方法和生命周期的方法。

在web.xml文件中配置过滤器(对同一个URL进行过滤)
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.web.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.web.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>


最后在index.jsp文件中加入一段输出信息,用于判断请求执行的过程:
System.out.println("index.jsp***");


当tomcat服务器启动的时候:
------------FilterDemoStatic------------
***********FilterDemo()******
FilterInit()
------------static------------
***********FilterTest()******
FilterTestInit()


是先加载了FilterDemo的静态块然后是构造方法,接着是Filter的初始化方法,最后才加载FilterTest的静态块跟构造方法,初始化方法。

当jsp页面发送请求时:
FilterTestStart---doFilter***
FilterStart------doFilter()------
index.jsp***
FilterEnd--------doFilter()-------
FilterTestEnd---doFilter***


执行的顺序就是FilterTest的doFilter()的start接着是FilterDemo的doFilter()的start,然后在请求,请求加载完整个页面之后才是FilterDemo的End,最后才是FilterStart的End。

这里的jsp页面只输出了一句index.jsp***,而不是两句的原因是因为jsp是同一个URL已经加载完成了,所以只输出了一句。

当tomcat服务器停止的时候:
FilterDestroy()-------
FilterTestDestroy()


首先被销毁的是FilterDemo过滤器,然后在是FilterTest过滤器。

最后我们可以得出结论就是:过滤器的转载顺序是服务器按照we.xml文件中定义的顺序从后往先的顺序转载的,而过滤的顺序就是按照先后顺序过滤的,而销毁也是从后往先销毁的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA servlet