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

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

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

    posts - 188,comments - 176,trackbacks - 0

    servlet API中最重要的一個功能就是能夠為servlet和JSP頁面定義過濾器。過濾器提供了某些早期服務器所支持的非標準"servlet鏈接"的一種功能強大且標準的替代品。
                                                                                                   
        過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。在這之后,過濾器可以作如下的選擇:

    1. 以常規的方式調用資源(即,調用servlet或JSP頁面)。

    2.利用修改過的請求信息調用資源。

    3. 調用資源,但在發送響應到客戶機前對其進行修改

    4. 阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。

     
    過濾器提供了幾個重要好處。


          首先,它以一種模塊化的或可重用的方式封裝公共的行為。你有30個不同的serlvet或JSP頁面,需要壓縮它們的內容以減少下載時間嗎?沒問題:構造一個壓縮過濾器,然后將它應用到30個資源上即可。

      其次,利用它能夠將高級訪問決策與表現代碼相分離。這對于JSP特別有價值,其中一般希望將幾乎整個頁面集中在表現上,而不是集中在業務邏輯上。例如,希望阻塞來自某些站點的訪問而不用修改各頁面(這些頁面受到訪問限制)嗎?沒問題:建立一個訪問限制過濾器并把它應用到想要限制訪問的頁面上即可。

          最后,過濾器使你能夠對許多不同的資源進行批量性的更改。你有許多現存資源,這些資源除了公司名要更改外其他的保持不變,能辦到么?沒問題:構造一個串替換過濾器,只要合適就使用它。

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

     

    [1].  建立基本過濾器


    建立一個過濾器涉及下列五個步驟:

    1)建立一個實現Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過濾代碼(見第2步),init方法建立設置操作,而destroy方法進行清楚。

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

    3)調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作為它的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。

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

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


    1.1  建立一個實現Filter接口的類
         所有過濾器都必須實現javax.servlet.Filter。這個接口包含三個方法,分別為doFilter、init和destroy。

     

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


    每當調用一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執行其doFilter方法。正是這個方法包含了大部分過濾邏輯。第一個參數為與傳入請求有關的ServletRequest。對于簡單的過濾器,大多數過濾邏輯是基于這個對象的。如果處理HTTP請求,并且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對象構造成HttpServletRequest。第二個參數為ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter并直接發送一個響應到客戶機。其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然后,在調用serlvet或JSP頁面后,過濾器可檢查輸出,如果合適就修改它,之后發送到客戶機。DoFilter的最后一個參數為FilterChain對象。對此對象調用doFilter以激活與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調用激活servlet或JSP本身。

     

    public void init(FilterConfig config)  thows ServletException

     

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

     

    public void destroy( )


        大多數過濾器簡單地為此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的文件或數據庫連接池等清除任務。


    1.2  將過濾行為放入doFilter方法
        doFilter方法為大多數過濾器地關鍵部分。每當調用一個過濾器時,都要執行doFilter。對于大多數過濾器來說,doFilter執行的步驟是基于傳入的信息的。因此,可能要利用作為doFilter的第一個參數提供的ServletRequest。這個對象常常構造為HttpServletRequest類型,以提供對該類的更特殊方法的訪問。

    1.3  調用FilterChain對象的doFilter方法
        Filter接口的doFilter方法以一個FilterChain對象作為它的第三個參數。在調用該對象的doFilter方法時,激活下一個相關的過濾器。這個過程一般持續到鏈中最后一個過濾器為止。在最后一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,并且中斷此調用過程的過濾器負責將輸出提供給客戶機。

    1.4  對適當的servlet和JSP頁面注冊過濾器
        部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。


    *******************************************************************************************************************************

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

    子元素:

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

    請注意,過濾是在serlvet規范2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3版本。下面介紹一個簡單的例子:

     

     <?xml version="1.0" encoding="ISO-8859-1"?>
        
    <!DOCTYPE web-app PUBLIC
           "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
        
    <web-app>
         
    <filter>
            
    <filter-name>MyFilter</filter-name>
            
    <filter-class>myPackage.FilterClass</filter-class>
          
    </filter>
          
    <!--  -->
          
    <filter-mapping></filter-mapping>
        
    </web-app>


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

      1、 filter-name  這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。

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

      3、 servlet-name  此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。

    下面舉一個例子:

        

    <?xml version="1.0" encoding="ISO-8859-1"?>
        
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
        
    <web-app>
          
    <filter>
            
    <filter-name>MyFilter</filter-name>
            
    <filter-class>myPackage.FilterClass</filter-class>
          
    </filter>
          
    <!--  -->
          
    <filter-mapping>
            
    <filter-name>MyFilter</filter-name>
            
    <url-pattern>/someDirectory/SomePage.jsp</url-pattern>
          
    </filter-mapping>
        
    </web-app>


     

    *******************************************************************************************************************************

    1.5  禁用激活器servlet
        在對資源應用過濾器時,可通過指定要應用過濾器的URL模式或servlet名來完成。如果提供servlet名,則此名稱必須與web.xml的servlet元素中給出的名稱相匹配。如果使用應用到一個serlvet的URL模式,則此模式必須與利用web.xml的元素servlet-mapping指定的模式相匹配。但是,多數服務器使用“激活器servlet”為servlet體統一個缺省的URL:http://host/WebAppPrefix/servlet/ServletName。需要保證用戶不利用這個URL訪問servlet(這樣會繞過過濾器設置)。

    例如,假如利用filter和filter-mapping指示名為SomeFilter的過濾器應用到名為SomeServlet的servlet,則如下:


     

    <filter>
          
    <filter-name>SomeFilter</filter-name>
          
    <filter-class>somePackage.SomeFilterClass</filter-class>
        
    </filter>
        
    <!--  -->
        
    <filter-mapping>
          
    <filter-name>SomeFilter</filter-name>
          
    <servlet-name>SomeServlet</servlet-name>
        
    </filter-mapping>

     

    接著,用servlet和servlet-mapping規定URL  http://host/webAppPrefix/Blah 應該調用SomeSerlvet,如下所示:

         

        <filter>
          
    <filter-name>SomeFilter</filter-name>
          
    <filter-class>somePackage.SomeFilterClass</filter-class>
        
    </filter>
        
    <!--  -->
        
    <filter-mapping>
          
    <filter-name>SomeFilter</filter-name>
          
    <servlet-name>/Blah</servlet-name>
        
    </filter-mapping>

     

         

    現在,在客戶機使用URL  http://host/webAppPrefix/Blah 時就會調用過濾器。過濾器不應用到http://host/webAppPrefix/servlet/SomePackage.SomeServletClass。盡管有關閉激活器的服務器專用方法。但是,可移植最強的方法時重新映射Web應用鐘的/servlet模式,這樣使所有包含此模式的請求被送到相同的servlet中。為了重新映射此模式,首先應該建立一個簡單的servlet,它打印一條錯誤消息,或重定向用戶到頂層頁。然后,使用servlet和servlet-mapping元素發送包含/servlet模式的請求到該servlet。程序清單9-1給出了一個簡短的例子。

    程序清單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"
            "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
        
    <web-app>
        
    <!--  -->
        
    <servlet>
          
    <servlet-name>Error</servlet-name>
          
    <servlet-class>somePackage.ErrorServlet</servlet-class>
        
    </servlet>
        
    <!--  -->
        
    <servlet-mapping>
          
    <servlet-name>Error</servlet-name>
          
    <url-pattern>/servlet/*</url-pattern>
        
    </servlet-mapping>
        
    <!--  -->
        
    </web-app>

     

    [2].實例:報告過濾器

         趁熱打鐵,我們來試驗一個簡單的過濾器,只要調用相關的servlet或JSP頁面,它就打印一條消息到標準輸出。為了完成此任務,相應的過濾器必須具有下面的內容:

    1)實現Filter接口的一個類。這個類名為ReportFilter,如程序清單9-2所示。這個類對init和destroy方法提供空體。

    2)在doFilter方法中過濾行為。每當調用與這個過濾器相關的servlet或JSP頁面時,doFilter方法就生成一個打印輸出,此輸出列出請求主機和調用的URL。因為getRequestURL方法位于HttpServletRequest而不是ServletRequest中,所以把ServletRequest對象構造為HttpServletRequest類型。

    3)調用FilterChain的doFilter方法。在打印輸出報告后,過濾器調用FilterChain的doFilter方法激活servlet或JSP頁面(如果有的話,調用下一個過濾器)

    4)對Web應用主頁和顯示TodaysSpecialservlet進行注冊。首先,filter元素將名稱Reporter與類moreservlets.filters.ReportFilter相關聯。然后,filter-mapping元素使用/index.jsp的url-pattern將過濾器與主頁相關聯。最后,filter-mapping元素使用TodaysSpecial的servlet-name將過濾器與TodaysSpecialservlet(名稱TodaysSpecial是在servlet元素中聲明的)相關聯。參見程序清單9-3。

    5)禁用激活器servlet。首先,建立一個RedirectorServlet(見程序清單9-6),它把接收到的所有請求重定向到此Web應用的主頁。接著,利用servlet和servlet-mapping元素(參見程序清單9-3)指定所有以http://host/webAppPrefix/servlet/ 開始的URL都應該激活RedirectorServlet。

    給出這些設置后,每當客戶機請求此Web應用主頁(程序清單9-4)或TodaysSpecialservlet(程序清單9-5)時,都調用此過濾器。

    程序清單9-2 ReportFilter.java

    package moreservlets.filters;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*// For Date class

    /** Simple filter that prints a report on the standard output
    * each time an associated servlet or JSP page is accessed.
    */


    public class ReportFilter implements Filter {
      
    public void doFilter(ServletRequest request,
                      ServletResponse response,
                     FilterChain chain)
          
    throws ServletException, IOException {
        HttpServletRequest req 
    = (HttpServletRequest)request;
        System.out.println(req.getRemoteHost() 
    +
                       
    " tried to access " +
                       req.getRequestURL() 
    +
                       
    " on " + new Date() + ".");
        chain.doFilter(request,response);
      }


      
    public void init(FilterConfig config)
          
    throws ServletException {
      }


     
    public void destroy() {}
    }

     

     


    程序清單9-3 web.xml(針對報告過濾器的摘錄)

     

    <?xml version="1.0" encoding="ISO-8859-1"?>
        
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
        
    <web-app>
          
    <!-- Register the name "Reporter" for ReportFilter. -->
          
    <filter>
            
    <filter-name>Reporter</filter-name>
            
    <filter-class>
              moreservlets.filters.ReportFilter
            
    </filter-class>
          
    </filter>
          
    <!--  -->
          
    <!-- Apply the Reporter filter to home page. -->
          
    <filter-mapping>
            
    <filter-name>Reporter</filter-name>
            
    <url-pattern>/index.jsp</url-pattern>
          
    </filter-mapping>
          
    <!-- Also apply the Reporter filter to the servlet named
              "TodaysSpecial".
          
    -->
          
    <filter-mapping>
            
    <filter-name>Reporter</filter-name>
            
    <servlet-name>TodaysSpecial</servlet-name>
          
    </filter-mapping>
          
    <!--  -->
        
          
    <!-- Give a name to the Today's Special servlet so that filters
              can be applied to it.
          
    -->
          
    <servlet>
            
    <servlet-name>TodaysSpecial</servlet-name>
            
    <servlet-class>
              moreservlets.TodaysSpecialServlet
            
    </servlet-class>
          
    </servlet>
          
    <!--  -->
        
          
    <!-- Make /TodaysSpecial invoke the servlet
              named TodaysSpecial (i.e., moreservlets.TodaysSpecial).
          
    -->
          
    <servlet-mapping>
            
    <servlet-name>TodaysSpecial</servlet-name>
            
    <url-pattern>/TodaysSpecial</url-pattern>
          
    </servlet-mapping>
        
          
    <!-- Turn off invoker. Send requests to index.jsp. -->
          
    <servlet-mapping>
            
    <servlet-name>Redirector</servlet-name>
            
    <url-pattern>/servlet/*</url-pattern>
          
    </servlet-mapping>
          
    <!--  -->
        
    </web-app> 



    轉:http://hi.baidu.com/javatwt/blog/item/d0b5bcef3c164fefcf1b3e11.html

    posted on 2007-05-24 11:21 cheng 閱讀(640) 評論(0)  編輯  收藏 所屬分類: JSP/Servlet
    主站蜘蛛池模板: 国产va免费精品| 亚洲国产精品一区第二页| 久久狠狠躁免费观看2020| 日日摸日日碰夜夜爽亚洲| 亚洲国产精品综合福利专区| 久久久久亚洲AV无码专区桃色| 免费鲁丝片一级在线观看| 1000部啪啪未满十八勿入免费| 男女拍拍拍免费视频网站| 国产成人精品日本亚洲语音 | 亚洲酒色1314狠狠做| 国产中文在线亚洲精品官网| 夫妻免费无码V看片| xxxx日本免费| 91人人区免费区人人| 国产成人精品无码免费看 | 亚洲一区二区精品视频| 日本v片免费一区二区三区| 欧美日韩国产免费一区二区三区| 1000部拍拍拍18勿入免费视频下载 | 中文字幕久精品免费视频| 精品无码一级毛片免费视频观看 | 久久aⅴ免费观看| 国产成人精品一区二区三区免费| 中文字幕不卡免费高清视频| 无码精品人妻一区二区三区免费 | 亚洲国产午夜福利在线播放| 免费看国产一级特黄aa大片| 国产精品视频免费一区二区三区| 成人毛片免费在线观看| 久九九精品免费视频| 希望影院高清免费观看视频| 一个人免费观看在线视频www| 色se01短视频永久免费| 毛片免费视频观看| 成人男女网18免费视频| 爽爽日本在线视频免费| 日日操夜夜操免费视频 | 人妻18毛片a级毛片免费看| www免费黄色网| 黄色片免费在线观看|