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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks
    軟件體系架構(gòu)模式在J2EE中的應(yīng)用 (2)
    作者:劉兵 時(shí)間: 2005年1月18日 16:47:39 來(lái)源:sanwin
        Servlet2.3 Filter

      1、Servlet Filter概述

      凡是開(kāi)發(fā)過(guò)J2EE的web application的人員都知道,經(jīng)常需要處理以下幾種情況:

       訪問(wèn)特定資源(Web 頁(yè)、JSP 頁(yè)、servlet)時(shí)的身份認(rèn)證
       應(yīng)用程序級(jí)的訪問(wèn)資源的審核和記錄
       應(yīng)用程序范圍內(nèi)對(duì)資源的加密訪問(wèn),它建立在定制的加密方案基礎(chǔ)上
       對(duì)被訪問(wèn)資源的及時(shí)轉(zhuǎn)換, 包括從 servlet 和 JSP 的動(dòng)態(tài)輸出
      
      在servlet2.3之前這些功能處理是很難實(shí)現(xiàn)的,但是Java Servlet 2.3 規(guī)范新增了不少激動(dòng)人心的功能,其中之一便是過(guò)濾器(Filter),其實(shí)這就是我們所說(shuō)的管道和過(guò)濾器體系架構(gòu)在J2EE中的應(yīng)用實(shí)踐. 通過(guò)使用該模式使得Web Application開(kāi)發(fā)者能夠在請(qǐng)求到達(dá)Web資源之前截取請(qǐng)求,在處理請(qǐng)求之后修改應(yīng)答。其結(jié)構(gòu)圖如下:



      一個(gè)執(zhí)行過(guò)濾器的Java 類(lèi)必須實(shí)現(xiàn)javax.servlet.Filter 接口。這一接口含有三個(gè)方法:

      init(FilterConfig):這是容器所調(diào)用的初始化方法。它保證了在第一次 doFilter() 調(diào)用前由容器調(diào)用。它能獲取在 web.xml 文件中指定的filter初始化參數(shù)。

      doFilter(ServletRequest, ServletResponse, FilterChain):這是一個(gè)完成過(guò)濾行為的方法。它同樣是上一個(gè)過(guò)濾器調(diào)用的方法。引入的 FilterChain 對(duì)象提供了后續(xù)過(guò)濾器所要調(diào)用的信息。

      destroy():容器在銷(xiāo)毀過(guò)濾器實(shí)例前,doFilter()中的所有活動(dòng)都被該實(shí)例終止后,調(diào)用該方法。



      2、Filter鏈介紹

      所有過(guò)濾器都服從調(diào)用的過(guò)濾器鏈,并通過(guò)定義明確的接口得到執(zhí)行。WebApplication可以指定許多過(guò)濾器來(lái)完成相關(guān)的工作.那么它們就組成一個(gè)過(guò)濾器鏈來(lái)完成相應(yīng)的工作.其結(jié)構(gòu)如下圖:



      3、例子

      3.1 簡(jiǎn)單filter

      在PetStore1.3.1中的就存在兩個(gè)Filter過(guò)濾器.其中一個(gè)過(guò)濾器,完成字符集的編碼的轉(zhuǎn)化,如大家經(jīng)常遇到的漢字編碼問(wèn)題,你只需配置為GBK即可.它從Web.xml之中讀取這些參數(shù)的配置信息,然后進(jìn)行編碼的轉(zhuǎn)化.另一個(gè)是安全校驗(yàn)Fliter,它負(fù)責(zé)進(jìn)行安全檢查哪些頁(yè)面可以進(jìn)行,哪些不可.它們組成一個(gè)Filter鏈,結(jié)構(gòu)圖和實(shí)現(xiàn)代碼如下:



    public class EncodingFilter implements Filter {
     private FilterConfig config = null;
     // default to ASCII
     private String targetEncoding = "ASCII";

     public void init(FilterConfig config) throws ServletException {
      this.targetEncoding = config.getInitParameter("encoding");
     }
     //在過(guò)濾器中實(shí)現(xiàn)字符集編碼轉(zhuǎn)化
     public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain)
     throws IOException, ServletException {
     
      HttpServletRequest request = (HttpServletRequest)srequest;
      request.setCharacterEncoding(targetEncoding);
      // move on to the next
      chain.doFilter(srequest,sresponse);
     }
     public void destroy() {
      ……………..
     }
    }

    public class SignOnFilter implements Filter {
     public void init(FilterConfig config) throws ServletException {
      this.config = config;
      URL protectedResourcesURL = null;
      try {
       protectedResourcesURL = config.getServletContext().getResource("/WEB-INF/signon-config.xml");
       ...............
      } catch (java.net.MalformedURLException ex) {
       System.out.println("SignonFilter: malformed URL exception: " + ex);
      }
     }

     public void destroy() {
      config = null;
     }
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
     throws IOException, ServletException {
      ........
     }
    }

      容器通過(guò) Web 應(yīng)用程序中的配置描述符 web.xml 文件解析過(guò)濾器配置信息。有兩個(gè)新的標(biāo)記與過(guò)濾器相關(guān):<filter> 和 <filter-mapping>。<filter> 標(biāo)記是一個(gè)過(guò)濾器定義,它必定有一個(gè) <filter- name> 和 <filter-class> 子元素。<filter-name> 子元素給出了一個(gè)與過(guò)濾器實(shí)例相關(guān)的名字。<filter-class> 指定了由容器載入的實(shí)現(xiàn)類(lèi)。您能隨意地包含一個(gè) <init-param> 子元素為過(guò)濾器實(shí)例提供初始化參數(shù)。<filter-mapping> 標(biāo)記代表了一個(gè)過(guò)濾器的映射,指定了過(guò)濾器會(huì)對(duì)其產(chǎn)生作用的 URL 的子集。

    <!-- Encoding Filter Declaration Start -->
    <filter>
     <filter-name>EncodingFilter</filter-name>
    ?。糳isplay-name>Encoding Filter</display-name>
     <description>no description</description>
    ?。糵ilter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter</filter-class>
    ?。糹nit-param>
     ?。紁aram-name>encoding</param-name>
     ?。紁aram-value>UTF-8</param-value>
    ?。?init-param>
    </filter>
    <!-- Encoding Filter Declaration End -->
    <!-- Signon Filter Declaration Start -->
    <filter>
     <filter-name>SignOnFilter</filter-name>
    ?。糳isplay-name>SignOn Filter</display-name>
    ?。糳escription>no description</description>
    ?。糵ilter-class>com.sun.j2ee.blueprints.signon.web.SignOnFilter</filter-class>
    </filter>
    <!-- Signon Filter Declaration End -->

    <!-- Encoding Filter Mapping Start-->
    <filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- Encoding Filter Mapping End -->
    <!-- Signon Filter Mapping Start-->
    <filter-mapping>
    ?。糵ilter-name>SignOnFilter</filter-name>
    ?。紆rl-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- Signon Filter Mapping End -->

      3.2 復(fù)雜的filter

      上面是petstore的例子,演示了通過(guò)Fliter修改字符編碼和安全認(rèn)證的功能.下面提供一個(gè)示例演示通過(guò)修改返回?cái)?shù)據(jù)(通過(guò)過(guò)濾器把response的字符串變成大寫(xiě)).

    public class UCaseResponse extends HttpServletResponseWrapper {
     public UCaseResponse(HttpServletResponse response) {
      super(response);
     }

     public PrintWriter getWriter() throws IOException {
      return new UCaseWriter(super.getWriter());
     }
    }

    public class UCaseWriter extends PrintWriter {
     public UCaseWriter(Writer out) {
      super(out);
     }
     public void write(int c) {
      super.write(Character.toUpperCase( (char) c));
     }
     public void write(char buf[], int off, int len) {
      for (int i = 0;i < len;i++) {
       write(buf[off + i]);
      }
     }
     public void write(String s, int off, int len) {
      for (int i = 0;i < len;i++) {
       write(s.charAt(off + i));
      }
     }
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
     try {
      filterChain.doFilter(request, new UCaseResponse((HttpServletResponse)(response)));
     }catch(Exception sx) {
      filterConfig.getServletContext().log(sx.getMessage());
    }

      該示例使用HttpServletResponseWrapper技術(shù),它是對(duì)HttpServletResponse的包裝,其實(shí)就是裝飾(decorate)設(shè)計(jì)模式的應(yīng)用.這個(gè)例子能夠工作的關(guān)鍵是UCaseResponse和UCaseWriter類(lèi),它實(shí)現(xiàn)了對(duì)每個(gè)要輸出的字符都轉(zhuǎn)成了大寫(xiě)后再寫(xiě)入實(shí)際的輸出流的功能。

      4、體系架構(gòu)的實(shí)現(xiàn)

      實(shí)現(xiàn)一個(gè)管道和過(guò)濾器一般要注意以下幾個(gè)方面:

      把系統(tǒng)任務(wù)分成一系列處理階段。

      根據(jù)管道和過(guò)濾器的設(shè)計(jì)方案,必須把系統(tǒng)處理的任務(wù)分割成相應(yīng)獨(dú)立的任務(wù),如日志,數(shù)據(jù)轉(zhuǎn)化,安全認(rèn)證等.這樣每個(gè)階段僅依賴(lài)其前一階段的輸出。通過(guò)數(shù)據(jù)流將所有階段相連起來(lái)。并且你可以進(jìn)行替換每個(gè)步驟,或者可以調(diào)整它們之間的順序,以產(chǎn)生新的結(jié)果.如petstore中的編碼轉(zhuǎn)化Filter和安全Filter,分成兩個(gè)獨(dú)立的處理階段.

      定義沿每個(gè)管道傳輸?shù)臄?shù)據(jù)格式。

      我們知道每個(gè)過(guò)濾器,定義一個(gè)統(tǒng)一格式以獲得最大的靈活性,因?yàn)樗惯^(guò)濾器的重組變得容易。如:每個(gè)過(guò)濾器的方法是doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)它們的參數(shù)是必須相同的.

      決定如何實(shí)現(xiàn)每個(gè)管道連接

      Filter過(guò)濾器的連接是推得方式來(lái)實(shí)現(xiàn)的.前一個(gè)過(guò)濾器主動(dòng)的調(diào)用filterChain.doFilter(request, response);來(lái)實(shí)現(xiàn)轉(zhuǎn)向下一個(gè)過(guò)濾器.

      設(shè)計(jì)和實(shí)現(xiàn)過(guò)濾器

      設(shè)計(jì)每個(gè)Filter具有獨(dú)立的功能,如編碼轉(zhuǎn)化,安全校驗(yàn),等功能.并且每個(gè)Fliter都應(yīng)該在實(shí)現(xiàn)javax.servlet.Filter接口.

      建立處理流水線

      過(guò)濾器的部署是在Web.xml中進(jìn)行配置,描述過(guò)濾器的實(shí)現(xiàn)類(lèi)以及它們的map關(guān)系,來(lái)確定它們的順序.
    posted on 2005-05-30 16:58 笨笨 閱讀(635) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2EE 、HibernateAndSpringALL
    主站蜘蛛池模板: 亚洲精品美女视频| 中文字幕免费在线看线人动作大片 | 久久夜色精品国产嚕嚕亚洲av| 三年片在线观看免费大全| 亚洲国产香蕉碰碰人人| 国产精品偷伦视频观看免费| 亚洲国产精品无码久久一区二区| 两性色午夜视频免费播放| 亚洲女同成av人片在线观看| 伊人免费在线观看| 亚洲av永久无码精品漫画| 8090在线观看免费观看| 亚洲一区二区三区久久| aa级一级天堂片免费观看| 亚洲色欲啪啪久久WWW综合网| 最新69国产成人精品免费视频动漫| 热99re久久免费视精品频软件| 亚洲中文字幕久久精品蜜桃| 国产视频精品免费| 有码人妻在线免费看片| 95老司机免费福利| 亚洲成AV人综合在线观看 | 69免费视频大片| 亚洲精品综合在线影院| 男人的天堂亚洲一区二区三区 | 免费无码又爽又刺激一高潮| 少妇中文字幕乱码亚洲影视| 久九九精品免费视频| 亚洲自偷自偷图片| 永久看日本大片免费35分钟| 亚洲精品亚洲人成在线| 中文字幕亚洲一区二区va在线| 亚洲精品免费观看| 国产AV无码专区亚洲AVJULIA| 1000部夫妻午夜免费| 日韩亚洲翔田千里在线| 国产AV无码专区亚洲精品| 成人浮力影院免费看| www.av在线免费观看| 亚洲第一区视频在线观看| 免费看小12萝裸体视频国产|