1. 程式人生 > >JavaWeb 之 18.過濾器

JavaWeb 之 18.過濾器

## 過濾器(重點) ##


**過濾器的概述**
    
    1.過濾器是雙向的
    2.攔截一堆目標資源。(由配置檔案決定)


    
**過濾器的簡單入門**    
    
    1.編寫一個類,實現filter介面,重寫3個方法
    2.在web.xml中進行配置。
        <!-- 配置過濾器的資訊 -->
        <filter>
            <!-- 配置名字 -->
            <filter-name>FilterDemo1</filter-name>
            <!-- 包名+類名 -->
            <filter-class>cn.itcast.filter.FilterDemo1</filter-class>
        </filter>
        <!-- 配置過濾器的對映 -->
        <filter-mapping>
            <filter-name>FilterDemo1</filter-name>
            <!-- 配置訪問方式 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        
**FilterChain物件**


    
    1.doFilter(ServletRequest request, ServletResponse response)     執行下一個過濾器,如果沒有下一個過濾器,訪問目標資源。
    
**過濾器的生命週期**

    1.Servlet生命週期:Servlet什麼時候建立?預設不是由伺服器啟動時建立的,第一次訪問的建立。呼叫init方法進行初始化操作。
                     Servlet什麼是銷燬?伺服器關閉的時候或者移除專案時候。預設呼叫destroy()方法。
    
    2.過濾器的生命週期:
        * void init(FilterConfig filterConfig)        -- 過濾器什麼時候建立的?
        * void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)  -- 放行
        * void destroy()    -- 過濾器什麼時候銷燬
        
    3.總結:伺服器啟動的時候建立過濾器例項(單例的),預設呼叫init方法進行初始化操作,doFilter方法就會執行。有一次執行一次。過濾器是關閉伺服器或者移除專案銷燬,銷燬之前呼叫destroy方法進行銷燬。
        

**FilterConfig介面**

    1.ServletConfig
        * 獲取servlet-name的名稱
        * 獲取初始化引數
        * 獲取ServletContext物件
        
    2.FilterConfig物件的方法
        * String getFilterName()                  -- 獲取<filter-name>的名稱
        * String getInitParameter(String name)  -- 獲取初始化引數的值(重點)
        * Enumeration getInitParameterNames()      -- 獲取初始化引數(重點)
        * ServletContext getServletContext()      -- 獲取ServletContext域物件(重點)
        
        
**過濾器的配置**


    
    1.配置<filter>
        * <filter-name>    -- 配置filter的名稱
        * <filter-class>    -- 包名+類名
        * <init-param>    -- 配置初始化引數
        
    2.配置<filter-mapping>
        * <filter-name>    -- 配置filter的名稱和<filter>標籤中的<filter-name>配置必須是相同的。
        * <url-pattern>    -- 配置過濾的路徑
            * 完全路徑匹配        以/開頭的   /aa        /aa/bb        localhost/day21/aa/bb
            * 目錄匹配            以/開頭的    /*        /aa/*        localhost/day21/aa/bb
            * 副檔名匹配        不能以/開頭   *.jsp                訪問所有的jsp都會被攔截    
            
            * 優先順序:完全路徑 > 目錄匹配 > 副檔名匹配
            * 在web.xml中配置2個(A,B)過濾器,每個過濾器的配置都是/*  AB過濾器執行順序是什麼樣的?
                * 和在web.xml中的配置(<filter-mapping>)順序有關。
            
        * <servlet-name>    -- 過濾器過濾指定的servlet  直接配置Servlet的名稱
        * <dispatcher>    
            * REQUEST    -- 預設只攔截請求。REQUEST也是預設值。
            * FORWARD    -- 只攔截轉發的
            * INCLUDE    -- 包含
            * ERROR        -- 需要在web.xml進行配置
            

            
**過濾器的案例**

**設定全域性的編碼**
    
    1.每次在編寫表單和向頁面做出響應的時候,都需要設定request和response的一些資訊。
    2.那咱們就可以使用過濾器來解決類似的問題。
    
    
**禁用瀏覽器的快取**
    
    1.記住CEP三個頭。日期型別。
    
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    // 第三個頭是日期型別
    response.setDateHeader("Expires", -1);

    
**分ip統計訪問的次數**
    
    1.怎麼獲取ip地址:request.getRemoteAddr() 
         * 1.獲取map
         * 2.獲取ip
         * 3.在map中和ip做對比
         *     * 如果map中有ip,獲取count,+1
         *     * 如果map中沒有ip,把ip和count=1存入到map中
         * 4.把map存入到ServletContext中
         * 5.放行


**自動登陸的功能**
    
    1.依賴登陸的功能。已搞定。
    2.分析需求:必須先登陸,並且選擇自動登陸的按鈕。下一次再直接訪問suc.jsp的時候,直接進去了,不用再登陸了。
    3.分析哪些技術?
        * 需要先使用cookie,cookie可以記住使用者名稱和密碼。下一次請求,預設攜帶cookie過來了。
        * 還需要session,第一次登陸的時候,把使用者名稱和密碼儲存到session中。通過session來判斷是否登陸成功。
        * 過濾器,攔截的目的:獲取cookie,獲取使用者名稱和密碼,和資料庫查詢,匹配了,把使用者的資訊放入session中。
        
    4.cookie技術,儲存資料,回寫到瀏覽器。設定有效時間。
        * 把使用者名稱和密碼儲存起來。回寫到客戶端上。


    5.分析的過程
        * 在過濾器中可以直接獲取session中的使用者資訊,如果user不為空,說明瀏覽器沒關。放行。
        * 從session中獲取不到user的資訊
        * 先獲取cookie,獲取指定名稱的cookie,
        * 如果cookie為空,放行。
        * 如果cookie不為空,獲取使用者名稱和密碼。去資料庫查詢。
        * 如果查詢不到,cookie的資訊不正確,放行(沒有存入session中)。
        * 如果查詢到了,cookie中的資訊是正確,把使用者的資訊儲存到session中。放行。


        
        
**URL級別(粗粒度)的許可權驗證**
    
    1.需求:依賴使用者登陸的功能。如果你的使用者的type型別是admin,只能讓使用者訪問/admin/xxx.jsp檔案。如果使用者的type是usesr的話,只能訪問/user/xxx.jsp的檔案。
    
    2.分析: