天天看點

Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器

Java Web學習十八:Filter與Listener

  • 一:Filter過濾器
    • 1.如何配置過濾器?
    • 2.Filter執行的流程(doFilter中的執行過程)
    • 3.Filter的生命周期
      • 1.init
      • 2.doFilter
      • 3.destroy
    • 4.Filter攔截配置詳解
    • 5.過濾器鍊(配置了多個過濾器)
  • 二:Filter使用案例
  • 三:Listener監聽器
    • 1.概念:web的三大元件(servlet,filter,listener)之一
    • 步驟:

一:Filter過濾器

Filter顧名思義,web中的過濾器,是在伺服器中的資源被通路時,Filter會将請求攔截下來,完成特殊的功能。一般用于完成通用的操作,如:登入驗證,統一編碼處理,敏感字元的過濾…

1.如何配置過濾器?

(1)IDEA支援用注解來配置攔截路徑,例如 @WebFilter("/*") //通路所有資源之前,都會執行該過濾器

(2)web.xml配置:Filter與Servlet一樣,web中用web,xml中同樣的可以配置,格式與Servlet也是一般

<filter>
    <filter-name>demo1</filter-name>
<!--        Filter所在位置-->
    <filter-class>cn.itcast.web.filter.FilterDome1</filter-class>
</filter>

<filter-mapping>
    <filter-name>demo1</filter-name>
<!--        攔截路徑-->
    <url-pattern>/*</url-pattern>
</filter-mapping>
           

2.Filter執行的流程(doFilter中的執行過程)

(1)執行過濾器

(2)執行放行後的資源 filterChain.doFilter(servletRequest,servletResponse);放行是指允許通路該資源

(3)回來執行放行代碼下邊的代碼

代碼如下:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    //對request對象請求消息進行增強
    System.out.println("FilterDome執行...");

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

    //對response對象的響應消息進行增強
    System.out.println("FilterDome再次的執行");
}
           

注意:連續通路資源時,每次都會執行Filter中的doFilter方法

3.Filter的生命周期

Filter中預設有init doFilter destroy 三個需要複寫的方法,故它的生命周期

1.init

是在伺服器啟動後,會建立一個Filter對象,然後調用init方法,init方法隻執行一次 用于加載資源

2.doFilter

每一次請求(通路資源時)被攔截時,會執行,并且doFilter方法會被執行多次(攔截幾次執行幾次)

3.destroy

在伺服器關閉後,Filter對象也被銷毀掉 ,伺服器正常關閉的話會執行destory方法,隻執行一次,來釋放資源

4.Filter攔截配置詳解

*攔截路徑配置:

(1)具體的資源路徑:/index.jsp 隻有通路index.jsp資源的時候,Filter才會被執行

(2)攔截目錄(某一目錄下是以的資源):/user/ 隻有通路/user下的資源時,Filter都會被執行*

(3)字尾名的攔截:*.jsp 通路所有字尾名為jsp的資源時,Filter都會被執行

(4)攔截所有的資源:/* 通路所有的資源時,Filter都會被執行

*攔截方式的配置:資源被通路的方式

*IDEA的注解配置:

*設定dispatcherTypes的屬性

      (1)REQUEST:為dispatchTypes的預設值,浏覽器直接請求資源。
      
      (2)FORWARD:轉發來通路資源

      (3)INCLUDE:包含通路資源

      (4)ERROR:錯誤跳轉資源

      (5)ASYNC:異步通路資源
           
Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器

例如 @WebFilter(value = “/index.jsp”,dispatcherTypes = DispatcherType.REQUEST ),浏覽器直接請求index.jsp資源時,通路是以資源都會執行該過濾器

還可以疊加 @WebFilter(value = “/index.jsp”, {DispatcherType.REQUEST,DispatcherType.FORWARD} )浏覽器直接請求或者轉發通路index.jsp資源時,通路是以資源都會執行該過濾器

*web.xml配置:

    * 設定<dispatcher></dispatcher>标簽即可
           

5.過濾器鍊(配置了多個過濾器)

(1)執行順序:如果有兩個過濾器:過濾器1和過濾器2

  1. 過濾器1
  2. 過濾器2
  3. 資源執行
  4. 過濾器2
  5. 過濾器1

注:類似于遞歸調用

Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器

2) 過濾器先後順序問題:

1. 注解配置:按照類名的字元串比較規則比較,值小的先執行

  • 如: AFilter 和 BFilter,AFilter就先執行了。
  1. web.xml配置: 誰定義在上邊,誰先執行。

二:Filter使用案例

1.登入驗證

  • 需求:
  1. 通路day17_case案例的資源。驗證其是否登入
  2. 如果登入了,則直接放行。
  3. 如果沒有登入,則跳轉到登入頁面,提示"您尚未登入,請先登入"。
    Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器
    1. 案例2_敏感詞彙過濾
  • 需求:
  1. 對day17_case案例錄入的資料進行敏感詞彙過濾
  2. 敏感詞彙參考《敏感詞彙.txt》(一個自建的敏感詞彙的文檔)
  3. 如果是敏感詞彙,替換為 ***
  • 分析:
  1. 對request對象進行增強。增強擷取參數相關方法
  2. 放行。傳遞代理對象
  • 增強對象的功能:
  • 設計模式:一些通用的解決固定問題的方式

例:聯想代理商賣電腦

  1. 裝飾模式
  2. 代理模式
  • 概念:
  1. 真實對象:被代理的對象

2. 代理對象:

3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的

  • 實作方式:
  1. 靜态代理:有一個類檔案描述代理模式
  2. 動态代理:在記憶體中形成代理類
  • 實作步驟:
  1. 代理對象和真實對象實作相同的接口

2. 代理對象 = Proxy.newProxyInstance();

3. 使用代理對象調用方法。

  1. 增強方法
  • 增強方式:
  1. 增強參數清單
  2. 增強傳回值類型
  3. 增強方法體執行邏輯
    Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器
    Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器
    實作案例:敏感詞彙
    Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器
    Java Web學習十八:Filter與Listener一:Filter過濾器二:Filter使用案例三:Listener監聽器
    增強getParameter方法,使得是敏感詞彙時,會顯示***

三:Listener監聽器

1.概念:web的三大元件(servlet,filter,listener)之一

(1)事件監聽機制

事件:一件事情

事件源:事件發生(進行)的地方

監聽器:一個建立的對象

注冊監聽:将事件,事件源,監聽器綁定在一起,當事件源發生某個事件後,執行監聽器代碼

(2)ServletCpntextListener:監聽ServletContext對象的建立和銷毀

方法:

void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷毀之前會調用該方法

void contextInitialized(ServletContextEvent sce) :ServletContext對象建立後會調用該方法

步驟:

1.定義一個類,實作ServletContextListener接口,并複寫起方法

2,配置

(1)web.xml

<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
           

指定初始化參數

(2)IDEA注解

繼續閱讀