posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          關于Filter的基本知識

          Posted on 2007-05-13 17:12 ZelluX 閱讀(543) 評論(0)  編輯  收藏 所屬分類: OOP

          1. Filter 簡介
          這方面的內(nèi)容以前看的幾本書里都找不到,想到了Sun J2EE的Tutorial,果然里面有比較詳細的解釋。
          Filter是一個傳輸請求或者響應的報頭和內(nèi)容的對象,通常的作用是:
          a) 根據(jù)不同情況處理請求。
          b) 阻止請求-響應的過遠傳送。(Block the request-and-response pair from passing any further.)
          c) 通過自定義新的請求版本,修改請求報頭和數(shù)據(jù)。
          d) 通過自定義新的響應版本,修改響應報頭和數(shù)據(jù)。
          e) 和外部資源交互。

          2. Filter 編程
          filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定義。
          其中最重要的方法是doFilter。它可以用來:
          a) 檢查請求報頭。
          b) 自定義請求對象。
          c) 自定義響應對象。
          d) 調(diào)用過濾鏈(filter chain)中的下一個實體(entity)。如果當前過濾器已經(jīng)是鏈中最后一個過濾器了,下一個實體就是鏈尾的資源;否則它就是在WAR中設置的下一個過濾器。當然也可以在此時通過不調(diào)用下一個實體來中斷請求、
          e) 在響應報頭調(diào)用下一個過濾器后檢查。
          f) 拋出反應處理錯誤的異常。

          3. 一個 Duke's Bookstore 的例子
          HitCounterFilter在servlet被訪問時計數(shù)。
          public final class HitCounterFilter implements Filter {
            private FilterConfig filterConfig = null;

            public void init(FilterConfig filterConfig)
              throws ServletException {
              this.filterConfig = filterConfig;
            }
            public void destroy() {
              this.filterConfig = null;
            }
            public void doFilter(ServletRequest request,
              ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
              if (filterConfig == null)
                return;
              StringWriter sw = new StringWriter();
              PrintWriter writer = new PrintWriter(sw);
              Counter counter = (Counter)filterConfig.
                getServletContext().
                getAttribute("hitCounter");
              writer.println();
              writer.println("===============");
              writer.println("The number of hits is: " +
                counter.incCounter());
              writer.println("===============");
              // Log the resulting string
              writer.flush();
              System.out.println(sw.getBuffer().toString());
              ...
              chain.doFilter(request, wrapper);
              ...
            }
          }

          4. 設置過濾器映射
          部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
          1.filter元素
          filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
          icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
          filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
          display-name 這是一個可選的元素,它給出IDE使用的短名稱。
          description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
          filter-class 這是一個必需的元素,它指定過濾器實現(xiàn)類的完全限定名。
          init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個過濾器元素可包含多個init-param元素。

          filter-mapping元素
          filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
          l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
          l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。
          l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。

           

          主站蜘蛛池模板: 溧阳市| 曲阳县| 德钦县| 柞水县| 桐柏县| 玉溪市| 华亭县| 专栏| 棋牌| 得荣县| 商南县| 遂溪县| 五莲县| 潜江市| 会昌县| 林西县| 武功县| 黄山市| 四子王旗| 成安县| 信宜市| 霍林郭勒市| 丰宁| 长乐市| 壤塘县| 库伦旗| 新龙县| 措美县| 克什克腾旗| 金昌市| 三河市| 榆社县| 安远县| 武陟县| 巨野县| 来凤县| 瑞昌市| 泰宁县| 天祝| 留坝县| 宝应县|