隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(2)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           過(guò)濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。在這之后,過(guò)濾器可以作如下的選擇:

          1. 以常規(guī)的方式調(diào)用資源(即,調(diào)用servlet或JSP頁(yè)面)。個(gè)人理解為請(qǐng)求通過(guò)過(guò)濾執(zhí)行其他的操作
          2.利用修改過(guò)的請(qǐng)求信息調(diào)用資源。對(duì)請(qǐng)求的信息加以修改,然后繼續(xù)執(zhí)行
          3. 調(diào)用資源,但在發(fā)送響應(yīng)到客戶(hù)機(jī)前對(duì)其進(jìn)行修改
          4. 阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源,返回一個(gè)特定的狀態(tài)代碼或生成替換輸出。個(gè)人理解為請(qǐng)求被攔截時(shí)強(qiáng)制執(zhí)行(跳轉(zhuǎn))的操作

          過(guò)濾器提供了幾個(gè)重要好處 :
                  首先,它以一種模塊化的或可重用的方式封裝公共的行為。你有30個(gè)不同的serlvet或JSP頁(yè)面,需要壓縮它們的內(nèi)容以減少下載時(shí)間嗎?沒(méi)問(wèn)題:構(gòu)造一個(gè)壓縮過(guò)濾器,然后將它應(yīng)用到30個(gè)資源上即可。

                 其次,利用它能夠?qū)⒏呒?jí)訪問(wèn)決策與表現(xiàn)代碼相分離。這對(duì)于JSP特別有價(jià)值,其中一般希望將幾乎整個(gè)頁(yè)面集中在表現(xiàn)上,而不是集中在業(yè)務(wù)邏輯上。例如,希 望阻塞來(lái)自某些站點(diǎn)的訪問(wèn)而不用修改各頁(yè)面(這些頁(yè)面受到訪問(wèn)限制)嗎?沒(méi)問(wèn)題:建立一個(gè)訪問(wèn)限制過(guò)濾器并把它應(yīng)用到想要限制訪問(wèn)的頁(yè)面上即可。

                 最后,過(guò)濾器使你能夠?qū)υS多不同的資源進(jìn)行批量性的更改。你有許多現(xiàn)存資源,這些資源除了公司名要更改外其他的保持不變,能辦到么?沒(méi)問(wèn)題:構(gòu)造一個(gè)串替換過(guò)濾器,只要合適就使用它。

                但要注意,過(guò)濾器只在與servlet規(guī)范2.3版兼容的服務(wù)器上有作用。如果你的Web應(yīng)用需要支持舊版服務(wù)器,就不能使用過(guò)濾器。

          1.   建立基本過(guò)濾器

          建立一個(gè)過(guò)濾器涉及下列五個(gè)步驟:
          1)建立一個(gè)實(shí)現(xiàn)Filter接口的類(lèi)。這個(gè)類(lèi)需要三個(gè)方法,分別是:doFilter、init和destroy
                 doFilter方法包含主要的過(guò)濾代碼(見(jiàn)第2步),init方法建立設(shè)置操作,而destroy方法進(jìn)行清楚。

          2)在doFilter方法中放入過(guò)濾行為。doFilter方法的第一個(gè)參數(shù)為ServletRequest對(duì)象。此對(duì)象給過(guò)濾器提供了對(duì)進(jìn)入的信息 (包括表單數(shù)據(jù)、cookie和HTTP請(qǐng)求頭)的完全訪問(wèn)。第二個(gè)參數(shù)為ServletResponse,通常在簡(jiǎn)單的過(guò)濾器中忽略此參數(shù)。最后一個(gè)參 數(shù)為FilterChain,如下一步所述,此參數(shù)用來(lái)調(diào)用servlet或JSP頁(yè)。

          3)調(diào)用FilterChain對(duì)象的doFilter方法。Filter接口的doFilter方法取一個(gè)FilterChain對(duì)象作為它的一個(gè)參 數(shù)。在調(diào)用此對(duì)象的doFilter方法時(shí),激活下一個(gè)相關(guān)的過(guò)濾器。如果沒(méi)有另一個(gè)過(guò)濾器與servlet或JSP頁(yè)面關(guān)聯(lián),則servlet或JSP 頁(yè)面被激活。

          4)對(duì)相應(yīng)的servlet和JSP頁(yè)面注冊(cè)過(guò)濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。

          5)禁用激活器servlet。防止用戶(hù)利用缺省servlet URL繞過(guò)過(guò)濾器設(shè)置。

          1.1   建立一個(gè)實(shí)現(xiàn)Filter接口的類(lèi)
                所有過(guò)濾器都必須實(shí)現(xiàn)javax.servlet.Filter。這個(gè)接口包含三個(gè)方法,分別為doFilter、init和destroy。

          public void doFilter(ServletRequset request,
                               ServletResponse response,
                               FilterChain chain)
               thows ServletException, IOException

          每當(dāng)調(diào)用一個(gè)過(guò)濾器(即,每次請(qǐng)求與此過(guò)濾器相關(guān)的servlet或JSP頁(yè)面)時(shí),就執(zhí)行其doFilter方法。正是這個(gè)方法包含了大部分過(guò)濾邏輯。 第一個(gè)參數(shù)為與傳入請(qǐng)求有關(guān)的ServletRequest。對(duì)于簡(jiǎn)單的過(guò)濾器,大多數(shù)過(guò)濾邏輯是基于這個(gè)對(duì)象的。如果處理HTTP請(qǐng)求,并且需要訪問(wèn)諸 如getHeader或getCookies等在ServletRequest中無(wú)法得到的方法,就要把此對(duì)象構(gòu)造成 HttpServletRequest。

          第二個(gè)參數(shù)為ServletResponse。除了在兩個(gè)情形下要使用它以外,通常忽略這個(gè)參數(shù)。首先,如果希望完全阻塞對(duì)相關(guān)servlet或JSP頁(yè) 面的訪問(wèn)。可調(diào)用response.getWriter并直接發(fā)送一個(gè)響應(yīng)到客戶(hù)機(jī)。其次,如果希望修改相關(guān)的servlet或JSP頁(yè)面的輸出,可把響 應(yīng)包含在一個(gè)收集所有發(fā)送到它的輸出的對(duì)象中。然后,在調(diào)用serlvet或JSP頁(yè)面后,過(guò)濾器可檢查輸出,如果合適就修改它,之后發(fā)送到客戶(hù)機(jī)。

          DoFilter的最后一個(gè)參數(shù)為FilterChain對(duì)象。對(duì)此對(duì)象調(diào)用doFilter以激活與servlet或JSP頁(yè)面相關(guān)的下一個(gè)過(guò)濾器。如果沒(méi)有另一個(gè)相關(guān)的過(guò)濾器,則對(duì)doFilter的調(diào)用激活servlet或JSP本身。

          public void init(FilterConfig config)   thows ServletException

          init方法只在此過(guò)濾器第一次初始化時(shí)執(zhí)行,不是每次調(diào)用過(guò)濾器都執(zhí)行它。對(duì)于簡(jiǎn)單的過(guò)濾器,可提供此方法的一個(gè)空體,但有兩個(gè)原因需要使用init。 首先,F(xiàn)ilterConfig對(duì)象提供對(duì)servlet環(huán)境及web.xml文件中指派的過(guò)濾器名的訪問(wèn)。因此,普遍的辦法是利用init將 FilterConfig對(duì)象存放在一個(gè)字段中,以便doFilter方法能夠訪問(wèn)servlet環(huán)境或過(guò)濾器名.其次,F(xiàn)ilterConfig對(duì)象具 有一個(gè)getInitParameter方法,它能夠訪問(wèn)部署描述符文件(web.xml)中分配的過(guò)濾器初始化參數(shù)。

          public void destroy( )
               大多數(shù)過(guò)濾器簡(jiǎn)單地為此方法提供一個(gè)空體,不過(guò),可利用它來(lái)完成諸如關(guān)閉過(guò)濾器使用的文件或數(shù)據(jù)庫(kù)連接池等清除任務(wù)。

          1.2   將過(guò)濾行為放入doFilter方法
               doFilter方法為大多數(shù)過(guò)濾器地關(guān)鍵部分。每當(dāng)調(diào)用一個(gè)過(guò)濾器時(shí),都要執(zhí)行doFilter。對(duì)于大多數(shù)過(guò)濾器來(lái)說(shuō),doFilter執(zhí)行的步驟是 基于傳入的信息的。因此,可能要利用作為doFilter的第一個(gè)參數(shù)提供的ServletRequest。這個(gè)對(duì)象常常構(gòu)造為 HttpServletRequest類(lèi)型,以提供對(duì)該類(lèi)的更特殊方法的訪問(wèn)。

          1.3   調(diào)用FilterChain對(duì)象的doFilter方法
               Filter接口的doFilter方法以一個(gè)FilterChain對(duì)象作為它的第三個(gè)參數(shù)。在調(diào)用該對(duì)象的doFilter方法時(shí),激活下一個(gè)相關(guān)的 過(guò)濾器。這個(gè)過(guò)程一般持續(xù)到鏈中最后一個(gè)過(guò)濾器為止。在最后一個(gè)過(guò)濾器調(diào)用其FilterChain對(duì)象的doFilter方法時(shí),激活servlet或 頁(yè)面自身。
          但是,鏈中的任意過(guò)濾器都可以通過(guò)不調(diào)用其FilterChain的doFilter方法中斷這個(gè)過(guò)程。在這樣的情況下,不再調(diào)用JSP頁(yè)面的serlvet,并且中斷此調(diào)用過(guò)程的過(guò)濾器負(fù)責(zé)將輸出提供給客戶(hù)機(jī)。

          1.4   對(duì)適當(dāng)?shù)膕ervlet和JSP頁(yè)面注冊(cè)過(guò)濾器
               部署描述符文件的2.3版本引入了兩個(gè)用于過(guò)濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊(cè)一個(gè)過(guò)濾對(duì)象,filter-mapping元素指定該過(guò)濾對(duì)象所應(yīng)用的URL。

          1.filter元素
          filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個(gè)可能的子元素:

          1、 icon   這是一個(gè)可選的元素,它聲明IDE能夠使用的一個(gè)圖象文件。
          2、filter-name   這是一個(gè)必需的元素,它給過(guò)濾器分配一個(gè)選定的名字。
          3、display-name   這是一個(gè)可選的元素,它給出IDE使用的短名稱(chēng)。
          4、 description   這也是一個(gè)可選的元素,它給出IDE的信息,提供文本文檔。
          5、 filter-class   這是一個(gè)必需的元素,它指定過(guò)濾器實(shí)現(xiàn)類(lèi)的完全限定名。
          6、 init-param   這是一個(gè)可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個(gè)過(guò)濾器元素可包含多個(gè)init-param元素。

          請(qǐng)注意,過(guò)濾是在serlvet規(guī)范2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3版本。下面介紹一個(gè)簡(jiǎn)單的例子:

          <xml version="1.0" encoding="ISO-8859-1"?>
              DOCTYPE web-app PUBLIC
                  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "     <web-app>
               <filter>
                  <filter-name>MyFilterfilter-name>
                  <filter-class>myPackage.FilterClassfilter-class>
                filter>
               
                <filter-mapping>...filter-mapping>
               <web-app>


          2.filter-mapping元素
              filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個(gè)可能的子元素:

          1、 filter-name   這個(gè)必需的元素必須與用filter元素聲明時(shí)給予過(guò)濾器的名稱(chēng)相匹配。

          2、 url-pattern   此元素聲明一個(gè)以斜杠(/)開(kāi)始的模式,它指定過(guò)濾器應(yīng)用的URL。所有filter-mapping元素中必須提供url-pattern或 servlet-name。但不能對(duì)單個(gè)filter-mapping元素提供多個(gè)url-pattern元素項(xiàng)。如果希望過(guò)濾器適用于多個(gè)模式,可重復(fù) 整個(gè)filter-mapping元素。

          3、 servlet-name   此元素給出一個(gè)名稱(chēng),此名稱(chēng)必須與利用servlet元素給予servlet或JSP頁(yè)面的名稱(chēng)相匹配。不能給單個(gè)filter-mapping元素提供 多個(gè)servlet-name元素項(xiàng)。如果希望過(guò)濾器適合于多個(gè)servlet名,可重復(fù)這個(gè)filter-mapping元素。
          下面舉一個(gè)例子:

          xml version="1.0" encoding="ISO-8859-1"?>
              DOCTYPE web-app PUBLIC
                  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                  "
              <web-app>
                <filter>
                  <filter-name>MyFilterfilter-name>
                  <filter-class>myPackage.FilterClassfilter-class>
                filter>
               
                <filter-mapping>
                  <filter-name>MyFilterfilter-name>
                  <url-pattern>/someDirectory/SomePage.jspurl-pattern>
                filter-mapping>
              web-app>

           

          1.5   禁用激活器servlet
               在對(duì)資源應(yīng)用過(guò)濾器時(shí),可通過(guò)指定要應(yīng)用過(guò)濾器的URL模式或servlet名來(lái)完成。如果提供servlet名,則此名稱(chēng)必須與web.xml的 servlet元素中給出的名稱(chēng)相匹配。如果使用應(yīng)用到一個(gè)serlvet的URL模式,則此模式必須與利用web.xml的元素servlet- mapping指定的模式相匹配。但是,多數(shù)服務(wù)器使用“激活器servlet”為servlet體統(tǒng)一個(gè)缺省的URL:http: //host/WebAppPrefix/servlet/ServletName。需要保證用戶(hù)不利用這個(gè)URL訪問(wèn)servlet(這樣會(huì)繞過(guò)過(guò)濾器 設(shè)置)。
          例如,假如利用filter和filter-mapping指示名為SomeFilter的過(guò)濾器應(yīng)用到名為SomeServlet的servlet,則如下:

          <filter>
                <filter-name>SomeFilterfilter-name>
                <filter-class>somePackage.SomeFilterClassfilter-class>
             <filter>
             
              <filter-mapping>
                <filter-name>SomeFilterfilter-name>
                <servlet-name>SomeServletservlet-name>
               <filter-mapping>

           


          接著,用servlet和servlet-mapping規(guī)定URL  
          http://host/webAppPrefix/Blah 應(yīng)該調(diào)用SomeSerlvet,如下所示:

          <filter>
                <filter-name>SomeFilterfilter-name>
                <filter-class>somePackage.SomeFilterClassfilter-class>
              filter>
             
              <filter-mapping>
                <filter-name>SomeFilterfilter-name>
                <servlet-name>/Blahservlet-name>
               <filter-mapping>

           


          現(xiàn)在,在客戶(hù)機(jī)使用URL   http://host/webAppPrefix/Blah 時(shí)就會(huì)調(diào)用過(guò)濾器。過(guò)濾器不應(yīng)用到
          http://host/webAppPrefix/servlet/SomePackage.SomeServletClass
          盡管有關(guān)閉激活器的服務(wù)器專(zhuān)用方法。但是,可移植最強(qiáng)的方法時(shí)重新映射Web應(yīng)用鐘的/servlet模式,這樣使所有包含此模式的請(qǐng)求被送到相同的 servlet中。為了重新映射此模式,首先應(yīng)該建立一個(gè)簡(jiǎn)單的servlet,它打印一條錯(cuò)誤消息,或重定向用戶(hù)到頂層頁(yè)。然后,使用servlet和 servlet-mapping元素發(fā)送包含/servlet模式的請(qǐng)求到該servlet。程序清單9-1給出了一個(gè)簡(jiǎn)短的例子。

          程序清單9-1 web.xml(重定向缺省servlet URL的摘錄)

          xml version="1.0" encoding="ISO-8859-1"?>
              DOCTYPE web-app PUBLIC
                   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                   "     <web-app>
             
              <servlet>
                <servlet-name>Errorservlet-name>
                <servlet-class>somePackage.ErrorServletservlet-class>
              servlet>
             
              <servlet-mapping>
                <servlet-name>Errorservlet-name>
                <url-pattern>/servlet/*url-pattern>
              servlet-mapping>
             
              <web-app>

          本文參考:http://www.javaeye.com/topic/140553


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 扎兰屯市| 哈密市| 五华县| 西和县| 西城区| 陆河县| 哈巴河县| 新巴尔虎左旗| 乐业县| 昆明市| 宣汉县| 楚雄市| 武城县| 钟祥市| 新昌县| 运城市| 小金县| 安吉县| 观塘区| 长治市| 双峰县| 凉城县| 丹江口市| 兴隆县| 阳春市| 苗栗市| 洪洞县| 蒙阴县| 子洲县| 稷山县| 海安县| 芜湖市| 夹江县| 彝良县| 云龙县| 城口县| 洞口县| 林周县| 高青县| 鞍山市| 平遥县|