天天看點

【過濾器篇】2.過濾器鍊:多個過濾器的應用1.思考2.建立兩個過濾器3.在web.xml檔案中注冊這兩個過濾器4.部署工程,通路資源

1.思考

  前面,我們學到了一個過濾器是如何建立的,以及過濾器的生命周期。我們的伺服器會根據使用者的請求,将通路的資源先按照要求進行過濾,過濾後回報給使用者相應的響應。那麼,當我們的伺服器中有多個過濾器的時候,它又會是怎麼樣的一個執行過程呢?

  過濾器,是用來過濾使用者通路的資源,即我們的網頁。如果兩個過濾器過濾的是不同的網頁,那麼他們彼此沒有交集,互不幹擾,各幹各的事情。但是如果我們的過濾器過濾的是相同的網頁的時候,那麼又是一個什麼樣的執行順序呢?可以舉一個我們生活中的例子:

【過濾器篇】2.過濾器鍊:多個過濾器的應用1.思考2.建立兩個過濾器3.在web.xml檔案中注冊這兩個過濾器4.部署工程,通路資源

  這是一個過濾器,每一層由不同的物質組成。從上往下假設為A,B,C,D,可以把A,B,C,D視為四個過濾器,他們就過濾相同的物質。過濾的順序當然是從上往下:A->B->C->D,這個順序是按照過濾器的排列順序決定的。是以在我們的程式中,過濾相同資源的過濾器的執行順序,也是按照其在web.xml檔案中注冊的順序執行的。

【過濾器篇】2.過濾器鍊:多個過濾器的應用1.思考2.建立兩個過濾器3.在web.xml檔案中注冊這兩個過濾器4.部署工程,通路資源

  好了,過濾器鍊了解了。接下來就做一個小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.部署工程,然後啟動的伺服器,從控制台上可以看見,兩個過濾器進行的初始化:

【過濾器篇】2.過濾器鍊:多個過濾器的應用1.思考2.建立兩個過濾器3.在web.xml檔案中注冊這兩個過濾器4.部署工程,通路資源

  b.通路index.jsp,在控制台可以看到如下效果:

【過濾器篇】2.過濾器鍊:多個過濾器的應用1.思考2.建立兩個過濾器3.在web.xml檔案中注冊這兩個過濾器4.部署工程,通路資源

 從控制台的輸出可以發現,先是執行第一個過濾器,緊接着執行第二個,第二個過濾器過濾完了,後面也沒有其他的過濾器,則列印end資訊,再列印第一個過濾器的end資訊。

  最後送上該工程的下載下傳位址:https://download.csdn.net/download/qq_36631076/10392232

繼續閱讀