Filter和Listener

## 今日內容
    1. Filter:過濾器
    2. Listener:監聽器


# Filter:過濾器
    1. 概念:
        * 生活中的過濾器:淨水器,空氣淨化器,土匪、
        * web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
        * 過濾器的作用:
            * 一般用於完成通用的操作。如:登錄驗證、統一編碼處理、敏感字符過濾...

    2. 快速入門:
        1. 步驟:
            1. 定義一個類,實現接口Filter
            2. 複寫方法
            3. 配置攔截路徑
                1. web.xml
                2. 註解
        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() {
            
                }
            }


    3. 過濾器細節:
        1. web.xml配置    
            <filter>
                <filter-name>demo1</filter-name>
                <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>demo1</filter-name>
                <!-- 攔截路徑 -->
                <url-pattern>/*</url-pattern>
            </filter-mapping>
        2. 過濾器執行流程
            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>誰定義在上邊,誰先執行
    4. 案例:
        1. 案例1_登錄驗證
            * 需求:
                1. 訪問day17_case案例的資源。驗證其是否登錄
                2. 如果登錄了,則直接放行。
                3. 如果沒有登錄,則跳轉到登錄頁面,提示"您尚未登錄,請先登錄"。
         
    

        2. 案例2_敏感詞彙過濾
            * 需求:
                1. 對day17_case案例錄入的數據進行敏感詞彙過濾
                2. 敏感詞彙參考《敏感詞彙.txt》
                3. 如果是敏感詞彙,替換爲 *** 

            * 分析:
                1. 對request對象進行增強。增強獲取參數相關方法
                2. 放行。傳遞代理對象


            * 增強對象的功能:
                * 設計模式:一些通用的解決固定問題的方式
                1. 裝飾模式
                2. 代理模式
                    * 概念:
                        1. 真實對象:被代理的對象
                        2. 代理對象:
                        3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的
                     * 實現方式:
                         1. 靜態代理:有一個類文件描述代理模式
                         2. 動態代理:在內存中形成代理類
                            * 實現步驟:
                                1. 代理對象和真實對象實現相同的接口
                                2. 代理對象 = Proxy.newProxyInstance();
                                3. 使用代理對象調用方法。
                                4. 增強方法

                            * 增強方式:
                                1. 增強參數列表
                                2. 增強返回值類型
                                3. 增強方法體執行邏輯    


## 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

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