《《servlet過濾器》培訓》由會員分享,可在線閱讀,更多相關《《servlet過濾器》培訓(28頁珍藏版)》請在裝配圖網上搜索。
1、JavaWEB開 發(fā) -Servlet過 濾 器 Filter(過濾器)簡介 Filter 的基本功能是對 Servlet 容器調用 Servlet 的過程進行攔截,從而在 Servlet 進行響應處理的前后實現(xiàn)一些特殊的功能。在 Servlet API 中定義了三個接口類來開供開發(fā)人員編寫 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一個實現(xiàn)了 Filter 接口的 Java 類,與 Servlet 程序相似,它由 Servlet 容器進行調用和執(zhí)行 Filter 程序需要在 web.xml 文件中進行注冊和設置它所能攔截的資源
2、:Filter 程序可以攔截 Jsp, Servlet, 靜態(tài)圖片文件和靜態(tài) html 文件 Filter 的過濾過程 Filter 的基本工作原理當在 web.xml 中注冊了一個 Filter 來對某個 Servlet 程序進行攔截處理時,這個 Filter 就成了 Servlet 容器與該 Servlet 程序的通信線路上的一道關卡,該 Filter 可以對 Servlet 容器發(fā)送給 Servlet 程序的請求和 Servlet 程序回送給 Servlet 容器的相應進行攔截,可以決定是否將請求繼續(xù)傳遞給 Servlet 程序,以及對請求和相應信息是否進行修改在一個 web 應用程序中
3、可以注冊多個 Filter 程序,每個 Filter 程序都可以對一個或一組 Servlet 程序進行攔截。若有多個 Filter 程序對某個 Servlet 程序的訪問過程進行攔截,當針對該 Servlet 的訪問請求到達時,web 容器將把這多個 Filter 程序組合成一個 Filter 鏈(過濾器鏈)。Filter 鏈中各個 Filter 的攔截順序與它們在應用程序的 web.xml 中映射的順序一致 Filter 接口 init(FilterConfig filterConfig)throws ServletException:在 web 應用程序啟動時,web 服務器將根據(jù) web
4、.xml 文件中的配置信息來創(chuàng)建每個注冊的 Filter 實例對象,并將其保存在服務器的內存中。Web容器創(chuàng)建 Filter 對象實例后,將立即調用該 Filter 對象的 init 方法。Init 方法在 Filter 生命周期中僅執(zhí)行一次,web 容器在調用 init 方法時,會傳遞一個包含 Filter 的配置和運行環(huán)境的 FilterConfig 對象(FilterConfig的 用 法 和 ServletConfig類 似 )。 利 用FilterConfig對 象 可 以 得 到 ServletContext對 象 , 以 及 部 署 描 述 符 中配 置 的 過 濾 器 的 初
5、始 化 參 數(shù) 。 在 這 個 方 法 中 , 可 以 拋 出ServletException異 常 , 通 知 容 器 該 過 濾 器 不 能 正 常 工 作 。 destroy():在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執(zhí)行一次。在 這 個 方 法 中 , 可 以 釋 放 過 濾 器 使 用的 資 源 。 與 開 發(fā) Servlet不 同 的 是 , Filter接 口 并 沒 有 相 應 的 實 現(xiàn) 類 可 供 繼 承 ,要 開 發(fā) 過 濾 器 , 只 能 直 接 實 現(xiàn) Filter接 口 。 Filter 接口 doFilter(Servl
6、etRequest request,ServletResponse response, FilterChain chain)throws java.io.IOException,ServletException: doFilter()方 法 類 似 于 Servlet接 口 的 service()方 法 。 當 客 戶 端 請 求 目標 資 源 的 時 候 , 容 器 就 會 調 用 與 這 個 目 標 資 源 相 關 聯(lián) 的 過 濾 器 的doFilter()方 法 。其中參數(shù) request, response 為 web 容器或 Filter 鏈的上一個 Filter 傳遞過來的請求和相
7、應對象;參數(shù) chain 為代表當前 Filter 鏈的對象,在特定的操作完成后, 可 以在當前 Filter 對象的 doFilter 方法內部需要調用 FilterChain 對象的 chain.doFilter(request,response)方法才能把請求交付給 Filter 鏈中的下一個 Filter 或者目標 Servlet 程序去處理,也 可 以 直 接 向 客戶 端 返 回 響 應 信 息 , 或 者 利 用 RequestDispatcher的 forward()和include()方 法 , 以 及 HttpServletResponse的 sendRedirect()方
8、 法 將 請 求轉 向 到 其 他 資 源 。 這 個 方 法 的 請 求 和 響 應 參 數(shù) 的 類 型 是ServletRequest和 ServletResponse, 也 就 是 說 , 過 濾 器 的 使 用 并 不 依賴 于 具 體 的 協(xié) 議 。 FilterChain接口: FilterChain接口:代表當前 Filter 鏈的對象。由容器實現(xiàn),容器將其實例作為參數(shù)傳入過濾器對象的doFilter()方法中。過濾器對象使用FilterChain對象調用過濾器鏈中的下一個過濾器,如果該過濾器是鏈中最后一個過濾器,那么將調用目標資源。 doFilter(ServletReques
9、t request,ServletResponse response)throws java.io.IOException:調用該方法將使過濾器鏈中的下一個過濾器被調用。如果是最后一個過濾器,會調用目標資源。 FilterConfig接口 javax.servlet.FilterConfig接口:該接口類似于ServletConfig接口,由容器實現(xiàn)。Servlet規(guī)范將代表 ServletContext 對象和 Filter 的配置參數(shù)信息都封裝在該對象中。Servlet 容器將其作為參數(shù)傳入過濾器對象的init()方法中。 String getFilterName():得到描述符中指定的過
10、濾器的名字。 String getInitParameter(String name): 返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null. Enumeration getInitParameterNames():返回過濾器的所有初始化參數(shù)的名字的枚舉集合。 public ServletContext getServletContext():返回Servlet上下文對象的引用。 過濾器的部署在實現(xiàn)一個過濾器后,需要在 web.xml 中進行注冊和設置它所能攔截的資源。這可以通過和元素來完成的。 元素(注冊Filter) 元素用于在Web應用程序中注冊一個過濾器。在元
11、素內 用于為過濾器指定一個名字,該元素的內容不能為空。 元素用于指定過濾器的完整的限定類名。 元素用于為過濾器指定初始化參數(shù),它的子元素指定參數(shù)的名字,指定參數(shù)的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數(shù)。 元素(注冊Filter) testFitler org.test.TestFiter word_file /WEB-INF/word.txt l Servlet容 器 對 部 署 描 述 符 中 聲 明 的 每 一 個 過 濾 器 , 只創(chuàng) 建 一 個 實 例 。 與 Servlet類 似 , 容 器 將 在 同 一 個 過 濾器 實 例 上 運 行 多 個
12、線 程 來 同 時 為 多 個 請 求 服 務 , 因 此 ,開 發(fā) 過 濾 器 時 , 也 要 注 意 線 程 安 全 的 問 題 。 映射 Filter 元素用于設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑( url樣式) 子元素用于設置filter的注冊名稱。該值必須是在元素中聲明過的過濾器的名字 設置 filter 所攔截的請求路徑(過濾器關聯(lián)的URL樣式) 指定過濾器所攔截的Servlet名稱。 指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORW
13、ARD和ERROR之一,默認REQUEST. 可以設置多個 子元素用來指定 Filter 對資源的多種調用方式進行攔截 映射 Filter 子元素可以設置的值及其意義: REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那么該過濾器就不會被調用。 INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。 FORWARD:如果目標資源是通過RequestDispatcher的forwa
14、rd()方法訪問時,那么該過濾器將被調用,除此之外,該過濾器不會被調用。 ERROR:如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。 映射 Filter testFilter /index.jsp REQUEST FORWARD testFilter /test.jsp 映射 Filter在同一個 web.xml 文件中可以為同一個 Filter 設置多個映射。若一個 Filter 鏈中多次出現(xiàn)了同一個 Filter 程序,這個 Filter 程序的攔截處理過程將被多次執(zhí)行 典型應用1:使瀏覽器不緩存頁面的過濾器:有 3 個 HTTP 響應頭字段
15、都可以禁止瀏覽器緩存當前頁面,它們在 Servlet 中的示例代碼如下: response.setDateHeader(Expires,-1); response.setHeader(Cache-Control,no-cache); response.setHeader(Pragma,no-cache);并不是所有的瀏覽器都能完全支持上面的三個響應頭,因此最好是同時使用上面的三個響應頭 典型應用2:字符編碼的過濾器通過配置參數(shù)encoding指明使用何種字符編碼,以處理Html Form請求參數(shù)的中文問題 典型應用3:檢測用戶是否登陸的過濾器:情景:系統(tǒng)中的某些頁面只有在正常登陸后才可以使用,
16、用戶請求這些頁面時要檢查 session 中有無該用戶信息,但在所有必要的頁面加上session的判斷相當麻煩的事情解決方案:編寫一個用于檢測用戶是否登陸的過濾器,如果用戶未登錄,則重定向到指的登錄頁面要求:需檢查的在 Session 中保存的關鍵字; 如果用戶未登錄,需重定向到指定的頁面(URL不包括 ContextPath); 不做檢查的URL列表(以分號分開,并且 URL 中不包括 ContextPath)都要采取可配置的方式 典型應用4:利用Filter限制用戶瀏覽權限 裝飾 HttpServletRequest 對象 需求:在 HttpServletRequest 對象到達 Serv
17、let 之前把用戶輸入的多余空格都去掉情景:因為 HttpServletRequest 對象里的請求參數(shù)都實際包含在 java.util.Map 對象里,而Map是不允許修改的,所以包含在 HttpServletRequest 對象里的請求參數(shù)不能被修改解決方案:采取 Decorator(裝飾器)模式 Decorator 模式因為繼承的關系,當需要改變某個對象的行為時,只須擴展這個對象所屬的類并重寫其有關的方法就可以達到目的。但是,當想要改變其行為的對象是由應用程序里的另一個子系統(tǒng)(例如:一個對象工廠或是一個Servlet 容器)負責構造,繼承機制將無能為力 Decorator 模式-情景已知
18、:Messager 類的定義(可以從它派生處一個之類);Messager 對象總是來自一個對象工廠(MessagerFactory),該工廠可以對它創(chuàng)建的每一個 Messager 對象進行初始化-通過調用 getMessage() 方法而獲得的 message 屬性也不例外(即不能對 Messager 對象進行初始化)假設:需要使用 Messager 類的 getMessage() 方法。有一個Util的使用工具類,該類中有如下方法: public static void broadcast(Message messager) System.out.println(messager.getMe
19、ssage(); Decorator 模式-需求,方案需求:讓 broadcast 方法打印的字母都是大寫字母方案:從 Messager 類派生一個子類,把子類對象傳遞給 broadcast 方法。因為只有對象工廠知道如何初始化 Messager 對象,所以該方案無意義 Decorator 模式:從 Messager 類派生一個子類 MessagerDecorator,把子類對象傳遞給 broadcast 方法在 MessagerDecorator 類里實現(xiàn)構造器:接受一個 Messager 對象作為輸入參數(shù),而這個 Messager 就是想要裝飾的對象:public MessagerDeco
20、rator(Messager messager)重寫 getMessage 方法,讓重寫的方法用大寫字母來返回 message 屬性 HttpServletRequestWrapper 類 Servlet API 中提供了一個 HttpServletRequestWrapper 類來包裝原始的 request 對象, HttpServletRequestWrapper 類實現(xiàn)了 HttpServletRequest 接口中的所有方法,這些方法的內部實現(xiàn)都是僅僅調用了一下所包裝的的 request 對象的對應方法相類似 Servlet API 也提供了一個 HttpServletResponse
21、Wrapper 類來包裝原始的 response 對象 典型應用5:為論壇過濾不雅文字和HTML特殊字符開發(fā)論壇模塊時要解決以下兩個問題: 1. 用戶回復或發(fā)帖時可能會輸入 HTML 代碼(例如:等),這可能會破壞論壇的正常顯示,也可能會帶來安全隱患。 2. 某些用戶在回復時可能會輸入不雅子句,這些子句會給論壇帶來不好的影響 3. 實現(xiàn)對不雅文字的可配置要求:不雅文字及其替換內容實現(xiàn)可配置。 留言程序數(shù)據(jù)庫的表字 段 名 稱 類 型 說 明 是 否 為 空title varchar(90) 留 言 的 標 題 noname varchar(20) 留 言 者 的 姓 名 noemail varchar(50) 留 言 者 的 email nocontent varchar(500) 留 言 的 具 體 內 容 nodate_time Date 留 言 的 時 間 no 例子:開發(fā)一個留言板程序 例子:開發(fā)一個留言板程序