【JavaWeb】(7)過濾器

1. 介紹

定義:過濾器是一個服務端的組件,它可以截取用戶端的請求與響應信息,並對這些信息過濾。

生命週期:


其中實例化是在Web項目啓動的時候執行,只會執行一次;初始化也只會執行一次;過濾會執行多次,每一次接受請求都會執行一次;銷燬是在Web容器關閉的時候執行。


2. 實現過濾器

過濾器實現了javax.servlet.Filter接口,需要我們實現3個方法:

init():這是過濾器的初始化方法,Web容器創建過濾器實例後將調用這個方法。這個方法中可以讀取web.xml文件中過濾器的參數。

doFilter():這個方法完成實際的過濾操作。這個地方是過濾器的核心方法。當用戶請求訪問與過濾器關聯的URL時,Web容器將先調用過濾器的doFilter方法。FilterChain參數可以調用chain.doFilter方法,將請求傳給下一個過濾器(或目標資源),或利用轉發、重定向將請求轉發到其它資源。

destroy():Web容器在銷燬過濾器實例前調用該方法,在這個方法中可以釋放過濾器佔用的資源。(大多數情況用不到)

web.xml配置:


<filter>標籤只能配置一個,而<filter-mapping>標籤可以配置多個。

一個簡單的Web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.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.thr.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
</web-app>
過濾器可以改變用戶的請求的Web資源,也就是可以改變用戶請求的路徑。

過濾器不能直接返回數據,不能直接處理用戶請求。


3. 過濾器鏈

多個過濾器同時過濾一個頁面時,會按照它們在web.xml中配置的順序先後執行doFilter的開始部分,然後執行doFilter處理,然後相反的順序執行doFilter的結束部分。


4. 過濾器分類

在Servlet2.5中:

(1). REQUEST:用戶直接訪問頁面時,Web容器將會調用過濾器,如果沒有配置的話,默認的是REQUEST

(2). FORWARD:目標資源是通過RequestDIspatcher的forward訪問時,該過濾器將被調用。

(3). INCLUDE:目標資源是通過RequestDIspatcher的include訪問時,該過濾器將被調用。

(4). ERROR:目標資源是通過聲明式異常處理機制調用時,過濾器將被調用。

使用重定向並且REQUEST時,可能會產生死循環。

使用請求轉發並且FORWARD時,可能會產生死循環。

在Servlet3.0中新增了ASYNC:支持異步處理。

@WebFilter:用於將一個類聲明爲過濾器,該註解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署爲過濾器。

使用@WebFilter,可以不必在web.xml中配置即可完成對過濾器的配置。


@WebFilter的常用屬性:


可以在web.xml中配置FilterConfig的初始化參數,在過濾器裏可以通過getInitParameter獲取初始化參數。


5. 應用場景

(1). 對用戶請求進行統一認證

(2). 編碼轉換

(3). 對用戶發送的數據進行過濾替換

(4). 轉換圖像格式

(5). 對響應的內容進行壓縮

一個解決中文亂碼的思路:在過濾器中進行request.setCharacterEncoding("utf-8")設置。





發佈了80 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章