1. 程式人生 > >JavaEE之過濾器-Filter

JavaEE之過濾器-Filter

過濾器

過濾器簡介

1)過濾器其實就是一個介面,Filter, javax.servet.Filter
2)過濾器就是一個物件,可以在請求一個資源(靜態或動態資源),或響應一個資源,或請求和響應一個資源的時候,執行過濾任務!!!!
3)過濾器如何被執行?
過濾器也需要交給tomcat伺服器執行!!!!
Servlet的三大元件:1)都需要交給web伺服器執行  2)在web.xml檔案中配置 
Servlet介面
Filter介面
Listener介面

4)過濾器的生命週期
構造方法: 在web應用載入時建立過濾器物件。只執行一次。證明過濾器在web伺服器中是單例項的
init方法: 在建立完過濾器物件之後被呼叫。只執行一次
doFilter方法: 執行過濾任務方法。執行多次。
destroy方法: web伺服器停止或者web應用重新載入,銷燬過濾器物件。
5)過濾器編寫步驟:
5.1 編寫一個java類,實現Filter介面,並實現其中的所有方法

5.1 在web.xml檔案中配置Filter

    <!-- 過濾器配置 -->
	<filter>
		<!-- 內部名稱 -->
		<filter-name>HelloFilter</filter-name>
		<!-- 類全名:包+簡單類名 -->
		<filter-class>gz.itcast.a_hello.HelloFilter</filter-class>
	</filter>
	<!-- 過濾器對映配置 -->
	<filter-mapping>
		<!-- 內部名稱,和上面的名稱保持一致! -->
		<filter-name>HelloFilter</filter-name>
		<!-- 需要攔截的路徑 -->
		<url-pattern>/hello</url-pattern>
	</filter-mapping>

過濾器的對映路徑

過濾器中的url-pattern: 表示的這個過濾器需要攔截的目標資源路徑(可以servlet路徑,也可以是靜態資源名稱)
Servlet中的url-pattern: 表示訪問這個servlet時的路徑
url-pattern                      瀏覽器訪問目標資源的路徑
精確過濾                    /hello                             http://localhost:8080/day21/hello
/itcast/hello                     http://localhost:8080/day21/itcast/hello


模糊過濾  
                    /*                                  http://localhost:8080/day21/任意路徑
/itcast/* http://localhost:8080/day21/itcast/任意路徑
*.字尾名 http://localhost:8080/day21/任意路徑.字尾名

注意:
1)url-pattern要麼以斜槓開頭,要麼以*開頭  例如: hello
2)不能同時使用兩個模糊過濾。例如 /*.do 是非法的
3)如果存在多個需要被過濾的資源,可以寫多個url-pattern去過濾。

4)如果是動態資源servlet,可以使用servlet的訪問名稱,也可以使用內部名稱

       <!-- 使用servlet的內部名稱 -->
		<servlet-name>HelloServlet</servlet-name>

        5)過濾型別:

		<!-- 過濾型別:宣告哪種請求才可以被攔截(過濾) -->
		<dispatcher>REQUEST</dispatcher><!-- 預設:來自於直接訪問的請求才可以被攔截 -->
		<dispatcher>FORWARD</dispatcher><!-- 來自於轉發的請求才可以被攔截 -->
		<dispatcher>INCLUDE</dispatcher><!-- 來自於包含的請求才可以被攔截 -->
		<dispatcher>ERROR</dispatcher><!-- 來自於錯誤的請求才可以被攔截 -->

FilterConfig物件

    FilterConfig物件,過濾器配置物件,用於載入過濾器的引數配置

過濾器引數使用:

1)在web.xml檔案中配置

<!-- 過濾器配置 -->
	<filter>
		<!-- 內部名稱 -->
		<filter-name>HelloFilter</filter-name>
		<!-- 類全名:包+簡單類名 -->
		<filter-class>gz.itcast.a_hello.HelloFilter</filter-class>
		<init-param>
			<param-name>AAA</param-name>
			<param-value>AAA'value</param-value>
		</init-param>
		<init-param>
			<param-name>BBB</param-name>
			<param-value>BBB'value</param-value>
		</init-param>
	</filter>

2)在過濾器器中使用

/**
	 * 2)init初始化方法
	 */
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("2)Filter生命週期-init方法");
		
		/**
		 * 通過FilterConfig物件得到引數配置資訊
		 */
		//得到一個引數
		System.out.println(filterConfig.getInitParameter("AAA"));
		
		Enumeration<String> enums = filterConfig.getInitParameterNames();
		//遍歷所有引數
		while(enums.hasMoreElements()){
			String paramName = enums.nextElement();
			String paramValue = filterConfig.getInitParameter(paramName);
			System.out.println(paramName+"="+paramValue);
		}
		
	}