Filter 攔截器 過濾器

Filter

1、過濾器,由servlet容器調用,用來攔截以及處理請求和響應
2、其本身不能生成請求和響應對象,但可以對請求和響應對象進行檢查和修改
3、過濾器介於客戶端與Servlet/JSP等相關的資源之間,對於與過濾器關聯的Servlet來說,過濾器可以在Servlet被調用之前檢查並且修改request對象,在Servlet調用之後檢查並修改response對象。 

工作原理

	1. 客戶端將請求發送給Web容器;
	2. Web容器根據客戶端發送的請求生成請求對象request和響應對象response。
	3. Web容器在調用與過濾器相關聯的Web組件(例如Servlet/JSP)之前,先將request對象以及response對象發送給過濾器。
	4. 過濾器對request對象進行必要的處理;
	5. 過濾器把處理過的request對象以及response對象傳遞給Web組件;
	6. Web組件調用完成後,再次通過過濾器,此時過濾器對response對象進行必要的處理;
	7. 過濾器把處理過的response對象傳遞給Web容器;
	8. Web容器將響應的結果返回到客戶端,並在瀏覽器上顯示。

過濾器執行流程

	1. 執行過濾器
	2. 執行放行後的資源
	3. 回來執行過濾器放行代碼下邊的代碼

使用

一、 步驟:
		1.  定義一個類,實現接口Filter
		2.  實現init( )方法,如有必要,讀取過濾器的初始化參數;
		3. 實現doFilter( )方法,完成對ServletRequest對象以及ServletResponse對象的檢查和處理;
		4. 在doFilter( )方法中調用FilterChain接口對象chain的doFilter( )方法,以便將過濾器傳遞給後續的過濾器或資源。
		5. 配置攔截路徑
			1. web.xml
			2. 註解
			
二、代碼:
		@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器
		public class FilterDemo1 implements Filter {
			@Override
			public void init(FilterConfig filterConfig) throws ServletException {

			}

			@Override
			public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
				System.out.println("filterDemo1被執行了....");


				//放行
				filterChain.doFilter(servletRequest,servletResponse);

			}

			@Override
			public void destroy() {

			}
		}

過濾器細節:

web.xml配置

		<filter>
	        <filter-name>filter名稱</filter-name>
	        <filter-class>filter全類名</filter-class>
	    </filter>
	    <filter-mapping>
	        <filter-name>filter名稱</filter-name>
			<!-- 攔截路徑 -->
	        <url-pattern>/ *</url-pattern>
	    </filter-mapping>
		
		<servlet-name>它用於設置當前Filter攔截哪一個servlet
						是通過servlet的name來確定的。

過濾器執行流程

		1. 執行過濾器
		2. 執行放行後的資源
		3. 回來執行過濾器放行代碼下邊的代碼
	3. 過濾器生命週期方法
		1. init:在服務器啓動後,會創建Filter對象,然後調用init方法。只執行一次。用於加載資源
		2. doFilter:每一次請求被攔截資源時,會執行。執行多次
		3. destroy:在服務器關閉後,Filter對象被銷燬。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用於釋放資源
	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配置
				* 設置<dispatcher></dispatcher>標籤即可
			
	5. 過濾器鏈(配置多個過濾器)
		* 執行順序:如果有兩個過濾器:過濾器1和過濾器2
			1. 過濾器1
			2. 過濾器2
			3. 資源執行
			4. 過濾器2
			5. 過濾器1 

		* 過濾器先後順序問題:
			1. 註解配置:按照類名的字符串比較規則比較,值小的先執行
				* 如: AFilter 和 BFilter,AFilter就先執行了。
			2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行		

Listener:監聽器

* 概念:web的三大組件之一。
	* 事件監聽機制
		* 事件	:一件事情
		* 事件源 :事件發生的地方
		* 監聽器 :一個對象
		* 註冊監聽:將事件、事件源、監聽器綁定在一起。 當事件源上發生某個事件後,執行監聽器代碼


* ServletContextListener:監聽ServletContext對象的創建和銷燬
	* 方法:
		* void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷燬之前會調用該方法
		* void contextInitialized(ServletContextEvent sce) :ServletContext對象創建後會調用該方法
	* 步驟:
		1. 定義一個類,實現ServletContextListener接口
		2. 複寫方法
		3. 配置
			1. web.xml
					<listener>
 					 <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
					</listener>

					* 指定初始化參數<context-param>
			2. 註解:
				* @WebListener
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章