Java Web之過濾器
1.過濾器的概念
過濾器是一個服務器端的組件,它可以攔截客戶端的請求和響應信息,並對這些信息進行過濾。
註意:1. javaWeb三大組件:Filter、Servlet、Listener
2. Filter 程序可以攔截 Jsp, Servlet, 靜態圖片文件和靜態 html 文件。
Servlet API中提供了一個Filter接口,如果編寫額類實現了這個接口,則稱這個類為過濾器。Filter接口源碼如下:
package javax.servlet; import java.io.IOException; public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException; public void destroy(); }
接口裏有三個抽象方法,分別是init() 初始化 , doFilter() 執行過濾 和destory()銷毀。
2. 過濾器的特點 請記住:一般處理方式是放行,轉發
1. 以常規方式調用資源(即,調用servlet或JSP頁面)
2. 利用修改過的請求信息調用資源
3. 調用資源,但在發送響應到客戶機前對其進行修改,修改響應
4. 阻止該資源調用,代之以轉到其他的資源,返回一個特定狀態代碼或生成替換輸出
5. 阻止資源調用,不轉到其它資源(錯誤的情況)
3. 過濾器的生命周期
Filter的創建和銷毀由WEB服務器負責
- 實例化———————————————–web.xml
- 初始化———————————————–init()
- 執行過濾——————————————–doFilter()
- 銷毀————————————————–destory()
1.實例化,執行構造方法。 :在web.xml中對過濾器進行配置和映射,也可以使用註解@WebFilter。
2.初始化:web容器創建過濾器實例後將調用init方法,這個方法的參數FilterConfig對象可以獲取web.xml文件中過濾器的初始化參數。在Filter的生命周期中,只會初始化一次。
3.執行過濾:當用戶訪問的URL與web.xml中url-pattern配置的值一樣時,就觸發這個過濾器,web容器會先調用過濾器,過濾器會調用doFilter方法,這個方法的參數FilterChain對象可以調用doFilter方法,將請求傳給下一個過濾器(過濾器鏈的情況下)或目標資源,也可以利用重定向或轉發的方式將請求轉發到其他資源。在Filter的生命周期中,可以執行0到n次過濾。
4.銷毀:web容器在銷毀過濾器實例前調用這個方法(比如stop tomcat),在這個方法中可以釋放過濾器占用的資源。在Filter的生命周期中,只會進行一次銷毀。
在web.xml中配置過濾器。這裏要謹記一條原則:在web.xml中,監聽器>過濾器>servlet。也就是說web.xml中監聽器配置在過濾器之前,過濾器配置在servlet之前,否則會出錯。
<!--配置過濾器--> <filter> <filter-name>FilterTest</filter-name> <filter-class>com.codeliu.FilterTest</filter-class> //類的全限定名(通過反射去創建這個過濾器對象)
<init—param> //可選 <param—name>參數名</param-name>//過濾器初始化參數 <param-value>參數值</param-value> </init—pamm> </filter> <!--映射過濾器--> <filter-mapping> <filter-name>FilterTest</filter-name> <url-pattern>/*</url-pattern>
<dispatcher>請求的類型</dispatcher>
</filter-mapping>
在配置中需要註意的有三處:<filter-class>(類的全限定名(通過反射去創建這個過濾器對象)
<url-pattren>要攔截的資源路徑
<dispatcher>請求的類型
<url-pattren>一般有以下規則:
1:作用與所有web資源:<url—pattern>/*</url-pattern>。則客戶端請求訪問任意資源文件時都要經過過濾器過濾,通過則訪問文件,否則攔截。
2:作用於某一文件夾下所有文件:<url—pattern>/dir/*</url-pattern>
3:作用於某一種類型的文件:<url—pattern>*.擴展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>過濾所有對jsp文件的訪問請求。
4:作用於某一文件夾下某一類型文件:<url—pattern>/dir/*.擴展名</url-pattern>
如果一個過濾器需要過濾多種文件,則可以配置多個<filter-mapping>,一個mapping定義一個url-pattern來定義過濾規則。
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.ygj.control.loginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
<dispatcher>請求的類型,四個取值,分別為 REQUEST | INCLUDE | ORWARD | ERROR,不填時默認為 REQUEST。
- REQUEST:當用戶直接訪問頁面時,web容器將會調用過濾器,如果目標資源是通過請求轉發(request.getRequestDisPatcher)的include方法或forward方法進行訪問,那麽該過濾器就不會被調用。
- INCLUDE:如果目標資源是通過request.getRequestDisPatcher的include方法進行訪問,那麽該過濾器將會被調用,其他情況下,不會被調用。
- FORWAED:如果目標資源是通過request.getRequestDisPatcher的forward方法進行訪問,那麽該過濾器將會被調用,其他情況下,不會被調用。
- ERROR:如果目標資源是通過聲明或異常處理機制調用,那麽該過濾器將會被調用,除此之外,不會被調用。
使用註解的方式
@WebFilter(urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "noFilterPath", value = "login.jsp;LoginServlet;fail.jsp", description = "不觸發該過濾器的頁面"),
@WebInitParam(name = "charset", value = "UTF-8")})
Java Web之過濾器