<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

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

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

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

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

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

    1.   建立基本過濾器

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

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

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

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

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

    1.1   建立一個(gè)實(shí)現(xiàn)Filter接口的類
          所有過濾器都必須實(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è)過濾器(即,每次請(qǐng)求與此過濾器相關(guān)的servlet或JSP頁面)時(shí),就執(zhí)行其doFilter方法。正是這個(gè)方法包含了大部分過濾邏輯。 第一個(gè)參數(shù)為與傳入請(qǐng)求有關(guān)的ServletRequest。對(duì)于簡(jiǎn)單的過濾器,大多數(shù)過濾邏輯是基于這個(gè)對(duì)象的。如果處理HTTP請(qǐng)求,并且需要訪問諸 如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對(duì)象構(gòu)造成 HttpServletRequest。

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

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

    public void init(FilterConfig config)   thows ServletException

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

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

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

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

    1.4   對(duì)適當(dāng)?shù)膕ervlet和JSP頁面注冊(cè)過濾器
         部署描述符文件的2.3版本引入了兩個(gè)用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊(cè)一個(gè)過濾對(duì)象,filter-mapping元素指定該過濾對(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è)必需的元素,它給過濾器分配一個(gè)選定的名字。
    3、display-name   這是一個(gè)可選的元素,它給出IDE使用的短名稱。
    4、 description   這也是一個(gè)可選的元素,它給出IDE的信息,提供文本文檔。
    5、 filter-class   這是一個(gè)必需的元素,它指定過濾器實(shí)現(xiàn)類的完全限定名。
    6、 init-param   這是一個(gè)可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個(gè)過濾器元素可包含多個(gè)init-param元素。

    請(qǐng)注意,過濾是在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í)給予過濾器的名稱相匹配。

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

    3、 servlet-name   此元素給出一個(gè)名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個(gè)filter-mapping元素提供 多個(gè)servlet-name元素項(xiàng)。如果希望過濾器適合于多個(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)用過濾器時(shí),可通過指定要應(yīng)用過濾器的URL模式或servlet名來完成。如果提供servlet名,則此名稱必須與web.xml的 servlet元素中給出的名稱相匹配。如果使用應(yīng)用到一個(gè)serlvet的URL模式,則此模式必須與利用web.xml的元素servlet- mapping指定的模式相匹配。但是,多數(shù)服務(wù)器使用“激活器servlet”為servlet體統(tǒng)一個(gè)缺省的URL:http: //host/WebAppPrefix/servlet/ServletName。需要保證用戶不利用這個(gè)URL訪問servlet(這樣會(huì)繞過過濾器 設(shè)置)。
    例如,假如利用filter和filter-mapping指示名為SomeFilter的過濾器應(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)在,在客戶機(jī)使用URL   http://host/webAppPrefix/Blah 時(shí)就會(huì)調(diào)用過濾器。過濾器不應(yīng)用到
    http://host/webAppPrefix/servlet/SomePackage.SomeServletClass
    盡管有關(guān)閉激活器的服務(wù)器專用方法。但是,可移植最強(qiáng)的方法時(shí)重新映射Web應(yīng)用鐘的/servlet模式,這樣使所有包含此模式的請(qǐng)求被送到相同的 servlet中。為了重新映射此模式,首先應(yīng)該建立一個(gè)簡(jiǎn)單的servlet,它打印一條錯(cuò)誤消息,或重定向用戶到頂層頁。然后,使用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è)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲精品免费网站| 美女黄频视频大全免费的| 亚洲欧洲另类春色校园小说| 亚洲日韩国产欧美一区二区三区| 乱人伦中文视频在线观看免费| 一级一级一片免费高清| 全部免费国产潢色一级| 亚洲的天堂av无码| 18女人腿打开无遮掩免费| 亚洲伦理一区二区| 51视频精品全部免费最新| 亚洲宅男天堂a在线| 国产精品久久永久免费| 亚洲国产成人精品无码区在线网站 | 美女啪啪网站又黄又免费| 国产免费小视频在线观看| 一级特级aaaa毛片免费观看 | 免费看的成人yellow视频| 风间由美在线亚洲一区| 亚洲А∨精品天堂在线| 亚洲日本国产综合高清| 日本无吗免费一二区| 五级黄18以上免费看| 亚洲成色www久久网站夜月| 免费A级毛片无码A∨中文字幕下载| 亚洲日本在线看片| 免费无码又黄又爽又刺激| 在线观看亚洲专区| 夜夜爽免费888视频| 偷自拍亚洲视频在线观看 | 亚洲AV无码一区二区三区DV| 污网站在线免费观看| 在线播放亚洲第一字幕| 亚美影视免费在线观看| 亚洲韩国—中文字幕| 在线视频免费国产成人| 成人免费区一区二区三区| 亚洲人成色在线观看| 亚洲精品国产精品乱码在线观看| 114一级毛片免费| 一级特黄特色的免费大片视频|