1. 程式人生 > >**過濾器_Filter&Listener [web基礎day18] *

**過濾器_Filter&Listener [web基礎day18] *

今日內容

1.FIlter:過濾器
2.Listener:監聽器

Filter:過濾器

1.概念:
	* 生活中的過濾器:淨水器,空氣淨化器。
	* web中的過濾器:當訪問伺服器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
	* 過濾器的作用:
		* 一般用於一些完成通過的操作,如:登入驗證,統一編碼處理(設定請求資訊編碼和響應資訊編碼),敏感詞操作。
		* 
2.快速入門:
	1.步驟
		1.定義一個類,實現介面Filter  導包一定要:javax.servlet包下的Filter;
			* 如果呼叫方法的時候沒有該功能方法,那麼可能是導錯包了。
		2.複寫方法
		3.配置攔截路徑
			1.註解配置		@WebFilter("/*")   訪問所有路徑。		@WebFilter("/demo")訪問demo的檔案。
				* 執行了語句之後要考慮放行:  filterChain.doFilter(servletRequest,servletResponse);    如果請求的是Servlet,則此方法會放請求去請求Servlet。如果沒有這行程式碼,那麼Filter則不放行,響應就會返回瀏覽器。(過濾器中的程式碼會執行兩次 --過去一遍,回來一遍。)
			2.web.xml配置
				
	-- 過程:
		* 瀏覽器發出請求,伺服器接收到請求
		* 找有沒有配置過濾器,如果有。符不符合過濾器的攔截路徑
				如果符合則被攔住
					1.放行:直接訪問資源
					2.不放行:原路返回
	-- 如果不符合直接可以訪問資源。

2.過濾器細節:
	1.web.xml配置
		* 參見截圖文件。
	2.過濾器執行流程
		* 執行過濾器
		* 執行放行後的資源
		* 回來執行過濾器放行程式碼下邊的程式碼。
	3.過濾器生命週期方法
			* init:servlet被建立的時候執行一次。(當伺服器啟動之後會直接建立Filter物件),用於載入資源。
			* destroy:servlet被銷燬的時候執行一次。(當伺服器正常關閉則執行此方法),用於釋放資源。
			* doFilter:當瀏覽器發出請求,並且請求的路徑符合此Filter攔截路徑,則doFilter方法會被呼叫一次。可執行多次。
	4.過濾器配置詳解
			* 攔截路徑配置:
				1.具體資源路徑:/index.jsp    只有訪問index.jsp資源時,過濾器才會被執行。
				2.攔截目錄:/user/*   :訪問/user下的所有資源時,過濾器都會被執行
				3.字尾名攔截:*.jsp    訪問所有後綴名為jsp資源時,過濾器都會被執行。
				4.攔截所有資源:/*  	 訪問所有資源時,過濾器都會執行。
			* 攔截方式配置:資源被訪問的方式。
				* 註解配置:
					* 設定dispatcherTypes屬性
						1.REQUEST:預設值,瀏覽器直接請求資源。
						2.FORWARD:轉發訪問資源
						3.INCLUDE:包含訪問資源
						4.ERROR:錯誤跳轉資源
						5.ASYNC:非同步訪問資源
				* web.xml配置
					設定dispatcherTypes
				* 列舉的內容相當於看到靜態常用。
	5.過濾器鏈(配置多個過濾器)
		* 執行順序:如果有兩個過濾器:過濾器1和過濾器2
			1.過濾器1先執行
			2.過濾器2再執行
			3.資源執行
			4.過濾器2
			5.過濾器1
			步驟演示:過濾器1-->過濾器2-->資源執行-->過濾器2-->過濾器1
		* 過濾器先後順序問題:
			1.註解配置:按照類名的字串比較,值小的先執行,從首字母開始,自然順序開始逐個比較,如果相等則取下一個比較,直到比出大小為止,字母在前的為先,數字小的為先,誰小先執行誰。	
				* 如:AFilter和BFilter,那麼AFilter先執行。	
			2.web.xml配置:<filter-mapping>誰定義在上邊,誰先執行。
			

	* 配置多個過濾器可以讓每個過濾器實現單獨的功能,解耦合。
	* 如何知道此請求是否是已經登入的使用者:
		* 如果登入了,則在Session中存一個登入使用者的id;
		* 有表示已經登入過了,則放行。
		* 如果沒有,則沒有登入,跳轉到登入頁面。
	-- 開閉原則:對於修改是關閉的,對於擴充套件是開放的。

	4.案例:
		1.案例1_登入驗證:    需要排除登入頁面,css檔案,js檔案,驗證碼伺服器檔案等。
			* 需求:
				1.訪問day17_case案例的資源。驗證其是否登入
				2.如果登入了,則直接放行
				3.如果沒有登入,則跳轉到登入頁面,提示:“您尚未登入,請先登入”。
		2.案例2_敏感詞彙過濾
			* 需求:
				* 

後面有時間再補全