1. 程式人生 > >Java Web之過濾器

Java Web之過濾器

config bsp 當前 被調用 script 每次 con destory 創建

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. 以常規方式調用資源(,調用servletJSP頁面)

2. 利用修改過的請求信息調用資源

3. 調用資源,但在發送響應到客戶機前對其進行修改,修改響應

4. 阻止該資源調用,代之以轉到其他的資源,返回一個特定狀態代碼或生成替換輸出

5. 阻止資源調用,不轉到其它資源(錯誤的情況)

3. 過濾器的生命周期

Filter的創建和銷毀由WEB服務器負責

在啟動tomcat的時候就行創建過濾器,並且執行init方法,完成對象的初始化。filter對象只會創建一次,init方法也只會執行一次。通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。 每次攔截到都會去執行doFilter方法。

  1. 實例化———————————————–web.xml
  2. 初始化———————————————–init()
  3. 執行過濾——————————————–doFilter()
  4. 銷毀————————————————–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。
  
  1. REQUEST:當用戶直接訪問頁面時,web容器將會調用過濾器,如果目標資源是通過請求轉發(request.getRequestDisPatcher)的include方法或forward方法進行訪問,那麽該過濾器就不會被調用。
  2. INCLUDE:如果目標資源是通過request.getRequestDisPatcher的include方法進行訪問,那麽該過濾器將會被調用,其他情況下,不會被調用。
  3. FORWAED:如果目標資源是通過request.getRequestDisPatcher的forward方法進行訪問,那麽該過濾器將會被調用,其他情況下,不會被調用。
  4. ERROR:如果目標資源是通過聲明或異常處理機制調用,那麽該過濾器將會被調用,除此之外,不會被調用。

使用註解的方式
@WebFilter(urlPatterns = {"/*"},  
           initParams = {@WebInitParam(name = "noFilterPath", value = "login.jsp;LoginServlet;fail.jsp", description = "不觸發該過濾器的頁面"),
       @WebInitParam(name = "charset", value = "UTF-8")})

 

 

Java Web之過濾器