過濾器

Servlet(Servlet都需要部署描述符中描述)的分類:
標準Servlet(JSP)---MVC
過濾Servlet(過濾器)
監聽Servelt(監聽器)
監聽器--類似一種組件,用的時候往上加就可以,過濾器整個都是自動調用執行的
Servlet應該是後期加入的功能

過濾器的實現:
    1.實現Filter接口 ----有三個方法
    init()----容器啓動時自動初始化,相當於Filter類的構造方法,但是它一樣可以有自己的構造方法,也會自動調用,且構造方法之後才調用init方法
    doFilter(ServletRequest request,ServletResponse response,FilterChain chain )---在訪問相應的url-pattern的時候自動調用執行
    destroy()
        注意其中的是ServletRequest,ServletResponse,不是HttpServletRequest,HttpServletResponse,不僅僅對HTTP協議起效
    2.在web.xml中進行配置
        <filter>
            <filter-name></filter-name> //這個Filter的name,就是生成的這個Filter的對象名
            <filter-class></filter-class> //這個Filter的”類路徑“(包.類)
        </filter>
        <filter-mapping>
            <filter-name></filter-name> //同上面<filter-name>的值
             <url-pattern></url-pattern> //對哪個頁面進行過濾,如果是對全部頁面,就是“/*”
        </filter-mapping>


<url-pattern></url-pattern>---表示對哪個頁面進行過濾,如果是對全部頁面,就是“/*”

doFilter()---就是將本身可以直接訪問的頁面,在訪問前,先訪問Filter,經過doFilter()處理,相關操作都是在doFilter()中

如果要將內容傳遞到目的地,就需要將請求向下轉發
FilterChain---完成請求的向下轉發.doFilter(request,response)--注意不是Filter的doFilter,是FilterChain的doFilter()
 
 過濾器執行幾次的問題:
 其實過濾器一般情況下如果是使用了FilterChain的doFilter()就使用了兩次,因爲其實調用doFilter()的時候就相當於使用完了這次的Filter
 而當請求向下轉發完成之後,它又會回到FilterChain的doFilter()這個地方(返回到先前調用doFilter()停住的地方繼續向下執行(相當於doFilter()函數返回了),又一次調用Filter.
 所以說使用了一次的,是說這個Filter的doFilter()只調用了一次,而說調用了兩次的是因爲FilterChain的doFilter()向下傳遞請求的時候已經出了當前的Filter,只是後來又回來了
 可以將Filter比作一個過濾用的門,請求來的時候經過一次,響應返回的時候再經過一次

 還有個特殊情況就是Filter中止了請求的進一步深入,即沒有再進一步調用FilterChain的doFilter函數了,那麼這時doFilter明顯只被執行了一次。

過濾器的功能
    1.任何網站都需要對網站是否登陸進行過濾---不過濾的時候是在jsp頁面判斷session
    eg.    與在jsp頁面中判斷類似,看session中是否有相應的屬性,有就將請求繼續傳遞,否則跳轉到登陸頁面(用RequestDispatcher,request對象,是ServletRequest對象可以取得RequestDispather,而不需要是HttpServletRequest)
            注意:jsp中的Session屬於HttpSession,是HTTP範疇,而Filter中的是不相關具體的協議的
            所以需要把request,強轉爲HttpRequest類型,才能得到session對象
            HttpServletRequest req = (HttpServletRequest)request;
            HttpSession session = req.getSession();//跳轉的時候用req.或者原來的request都能
            取得RequestDispatcher,request/req.getRequestDispatcher().forward(requst/req.response);
    2.網上聊天系統,屏蔽非法文字
        eg.獲取相應的內容,查看那是否有相應的內容,有則進行相關處理,沒有請求繼續傳遞
    3.對請求的內容進行統一編碼
        eg.直接在Filter中的doFilte函數中先request.setCharacterEncoding()然後再傳遞請求即可,這樣以後的處理都不需要再進行這樣的操作,可以避免之後很多
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章