posts - 23, comments - 0, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          過濾器總結

          Posted on 2008-08-18 17:05 beauty9235 閱讀(217) 評論(0)  編輯  收藏

          作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229651  發表時間: 2008年06月09日

          聲明:本文系JavaEye網站發布的原創博客文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任!

          過濾器總結
          一、Servlet過濾器的概念:

          Servlet過濾器是在Java Servlet規范2.3中定義的,它能夠對Servlet容器的請求和響應對象進行檢查和修改。   

          Servlet過濾器本身并不產生請求和響應對象,它只能提供過濾作用。Servlet過期能夠在Servlet被調用之前檢查Request對象,修改Request Header和Request內容;在Servlet被調用之后檢查Response對象,修改Response Header和Response內容。

          Servlet過期負責過濾的Web組件可以是Servlet、JSP或者HTML文件。 

           

          二、Servlet過濾器的特點:

          A.Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對象
          B.Servlet過濾器可以被指定和特定的URL關聯,只有當客戶請求訪問該URL時,才會觸發過濾器
          C.Servlet過濾器可以被串聯在一起,形成管道效應,協同修改請求和響應對象

           

          三、Servlet過濾器的作用:

          A.查詢請求并作出相應的行動。
          B.阻塞請求-響應對,使其不能進一步傳遞。
          C.修改請求的頭部和數據。用戶可以提供自定義的請求。
          D.修改響應的頭部和數據。用戶可以通過提供定制的響應版本實現。
          E.與外部資源進行交互。

           

          四、Servlet過濾器的適用場合:

          A.認證過濾
          B.登錄和審核過濾
          C.圖像轉換過濾
          D.數據壓縮過濾
          E.加密過濾
          F.令牌過濾
          G.資源訪問觸發事件過濾
          H.XSL/T過濾
          I.Mime-type過濾

           

          五、Servlet過濾器接口的構成:

          所有的Servlet過濾器類都必須實現javax.servlet.Filter接口。這個接口含有3個過濾器類必須實現的方法:

          A.init(FilterConfig):
          這是Servlet過濾器的初始化方法,Servlet容器創建Servlet過濾器實例后將調用這個方法。在這個方法中可以讀取web.xml文件中Servlet過濾器的初始化參數

          B.doFilter(ServletRequest,ServletResponse,FilterChain):
          這個方法完成實際的過濾操作,當客戶請求訪問于過濾器關聯的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain參數用于訪問后續過濾器

          B.destroy():
          Servlet容器在銷毀過濾器實例前調用該方法,這個方法中可以釋放Servlet過濾器占用的資源

           

          六、Servlet過濾器的創建步驟:

          A.實現javax.servlet.Filter接口
          B.實現init方法,讀取過濾器的初始化函數
          C.實現doFilter方法,完成對請求或過濾的響應
          D.調用FilterChain接口對象的doFilter方法,向后續的過濾器傳遞請求或響應
          E.銷毀過濾器

           

          七、Servlet過濾器對請求的過濾:

          A.Servlet容器創建一個過濾器實例
          B.過濾器實例調用init方法,讀取過濾器的初始化參數
          C.過濾器實例調用doFilter方法,根據初始化參數的值判斷該請求是否合法
          D.如果該請求不合法則阻塞該請求
          E.如果該請求合法則調用chain.doFilter方法將該請求向后續傳遞

           

          八、Servlet過濾器對響應的過濾:

          A.過濾器截獲客戶端的請求
          B.重新封裝ServletResponse,在封裝后的ServletResponse中提供用戶自定義的輸出流
          C.將請求向后續傳遞
          D.Web組件產生響應
          E.從封裝后的ServletResponse中獲取用戶自定義的輸出流
          F.將響應內容通過用戶自定義的輸出流寫入到緩沖流中
          G.在緩沖流中修改響應的內容后清空緩沖流,輸出響應內容


          九、Servlet過濾器的發布:

          A.發布Servlet過濾器時,必須在web.xml文件中加入<filter>元素和<filter-mapping>元素。

          B.<filter>元素用來定義一個過濾器:
          屬性                   含義
          filter-name    指定過濾器的名字
          filter-class    指定過濾器的類名
          init-param    為過濾器實例提供初始化參數,可以有多個

          C.<filter-mapping>元素用于將過濾器和URL關聯:
          屬性                     含義
          filter-name    指定過濾器的名字
          url-pattern    指定和過濾器關聯的URL,為"/"表示所有URL

           

          十一、Servlet過濾器使用的注意事項

          A.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的請求、響應對象ServletRequest、ServletResponse在使用前都必須先轉換成HttpServletRequest、HttpServletResponse再進行下一步操作。

          B.在web.xml中配置Servlet和Servlet過濾器,應該先聲明過濾器元素,再聲明Servlet元素


          C.如果要在Servlet中觀察過濾器生成的日志,應該確保在server.xml的localhost對應的<host>元素中配置如下<logger>元素:
          <Logger className = "org.apache.catalina.logger.FileLogger"
          directory = "logs" prefix = "localhost_log."suffix=".txt"
          timestamp = "true"/>

          常用的過濾器實例:

          //對整站編碼的過濾
          public void doFilter(ServletRequest request, ServletResponse sresponse,FilterChain chain) {
            try{
             request.setCharacterEncoding("GBK");
             chain.doFilter(request, sresponse);
            }catch(Exception e){
             e.printStackTrace();
            }
           }
          //對用戶登陸進行驗證 
           public void doFilter(ServletRequest srequest, ServletResponse sresponse,FilterChain chain) {
            try {
             HttpServletRequest request = (HttpServletRequest) srequest;
             HttpServletResponse response = (HttpServletResponse) sresponse;
             HttpSession session = request.getSession();
             User user = (User) session.getAttribute("user");
             if (user == null) { 
               response.sendRedirect("/test/index.html"); 
             } else {
              chain.doFilter(request, response);
             }
            } catch (Exception e) {
             e.printStackTrace();
            }
           }
          //對用戶權限進行過濾 
          public void doFilter(ServletRequest srequest, ServletResponse sresponse,FilterChain chain) {
            try {
             HttpServletRequest requst = (HttpServletRequest) srequest;
             HttpServletResponse response = (HttpServletResponse) sresponse;
             HttpSession session = requst.getSession();
             User user = (User) session.getAttribute("user");
             String ad=user.getIsAdmin().toString();
             if (user == null || ad.equals("0")) { 
               response.sendRedirect("/test/main.jsp");
             } else {
              chain.doFilter(srequest, sresponse);
             }
            } catch (Exception e) {
             e.printStackTrace();
            }
           } 
          

          web.xml中的配置

          
              encodingfilter
              filter.EncodingFilter
            
            
            firstfilter
            filter.FirstFilter
            
            
            secondfilter
            filter.SecondFilter
            
            
              encodingfilter
              /*
            
            
              firstfilter
              /web/*
            
              
              secondfilter
              /web/Charge.jsp
             
          

          本文的討論也很精彩,瀏覽討論>>


          JavaEye推薦




          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大理市| 正安县| 巧家县| 内江市| 东乡| 寿宁县| 如皋市| 札达县| 巴南区| 黄大仙区| 东兰县| 青龙| 富阳市| 沧州市| 凌海市| 镇赉县| 葫芦岛市| 青阳县| 台南市| 谢通门县| 温泉县| 泾源县| 丘北县| 水城县| 庐江县| 安新县| 平舆县| 黑龙江省| 丹凤县| 广昌县| 墨玉县| 崇明县| 唐海县| 仙桃市| 肃宁县| 五原县| 乌海市| 珲春市| 黑山县| 巴林左旗| 通许县|