1.思考
前面,我們學到了一個過濾器是如何建立的,以及過濾器的生命周期。我們的伺服器會根據使用者的請求,将通路的資源先按照要求進行過濾,過濾後回報給使用者相應的響應。那麼,當我們的伺服器中有多個過濾器的時候,它又會是怎麼樣的一個執行過程呢?
過濾器,是用來過濾使用者通路的資源,即我們的網頁。如果兩個過濾器過濾的是不同的網頁,那麼他們彼此沒有交集,互不幹擾,各幹各的事情。但是如果我們的過濾器過濾的是相同的網頁的時候,那麼又是一個什麼樣的執行順序呢?可以舉一個我們生活中的例子:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXyMGRNhXTq5kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TNzcjN0YjM1EDNwUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這是一個過濾器,每一層由不同的物質組成。從上往下假設為A,B,C,D,可以把A,B,C,D視為四個過濾器,他們就過濾相同的物質。過濾的順序當然是從上往下:A->B->C->D,這個順序是按照過濾器的排列順序決定的。是以在我們的程式中,過濾相同資源的過濾器的執行順序,也是按照其在web.xml檔案中注冊的順序執行的。
好了,過濾器鍊了解了。接下來就做一個小demo,實作兩個過濾器過濾相同資源時的執行效果。
2.建立兩個過濾器
第一個過濾器:FirstFilter
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 2018.5.3 Dragon
* 過濾器生命周期的demo
*/
public class FirstFilter implements Filter {
@Override
public void destroy()
{
System.out.println("FirstFilter----------------destroy");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("FirstFilter:start----------doFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("FirstFilter:end------------doFilter");
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
System.out.println("FirstFilter----------------init");
}
}
第二個過濾器:SecondFilter
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 2018.5.3 Dragon
* 過濾器生命周期的demo
*/
public class SecondFilter implements Filter {
@Override
public void destroy()
{
System.out.println("SecondFilter----------------destroy");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("SecondFilter:start----------doFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("SecondFilter:end------------doFilter");
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
System.out.println("SecondFilter----------------init");
}
}
3.在web.xml檔案中注冊這兩個過濾器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
由上面可以看見,兩個過濾器過濾的都是:index.jsp這個頁面
4.部署工程,通路資源
a.部署工程,然後啟動的伺服器,從控制台上可以看見,兩個過濾器進行的初始化:
b.通路index.jsp,在控制台可以看到如下效果:
從控制台的輸出可以發現,先是執行第一個過濾器,緊接着執行第二個,第二個過濾器過濾完了,後面也沒有其他的過濾器,則列印end資訊,再列印第一個過濾器的end資訊。
最後送上該工程的下載下傳位址:https://download.csdn.net/download/qq_36631076/10392232