隨筆 - 100  文章 - 50  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          過(guò)濾是SERVLET23規(guī)范新有的功能,目前TOMCAT4WEBLOGIC7都已支持。它能實(shí)現(xiàn)很多以前使用不便或很難實(shí)現(xiàn)的功能,在產(chǎn)品體系中,我們可以很好地使用SERVLET過(guò)濾,使得各個(gè)部件可以在保持系統(tǒng)統(tǒng)一權(quán)限控制的前提下,來(lái)實(shí)現(xiàn)各個(gè)獨(dú)自的個(gè)性權(quán)限系統(tǒng)。

          下面先看下SERVLET過(guò)濾是如何工作的,如下圖

          優(yōu)點(diǎn)

          和傳統(tǒng)架構(gòu)相比,SERVLET過(guò)濾的優(yōu)點(diǎn)如下:

          在傳統(tǒng)架構(gòu)中:

          • 每次接受到請(qǐng)求,掛鉤式方法就被調(diào)用,不論它們是否執(zhí)行(有時(shí)甚至是空的)。
          • 方法的作用域及并發(fā)關(guān)系(每個(gè)方法可能在不同的線程上被調(diào)用)不允許在處理相同的請(qǐng)求時(shí)簡(jiǎn)單、高效地共享不同掛鉤式方法調(diào)用間的變量和信息。

          SERVLET過(guò)濾中:

          • 嵌套的方法調(diào)用通過(guò)一系列過(guò)濾器實(shí)現(xiàn),它僅有應(yīng)用于當(dāng)前請(qǐng)求的過(guò)濾器組成;基于掛鉤式調(diào)用的傳統(tǒng)執(zhí)行方式需要在處理短句中調(diào)用掛鉤式例程,即使一個(gè)特定短句的處理邏輯不起任何作用。
          • 局部變量在實(shí)際的過(guò)濾方法返回之前都作保留,并且可用(因?yàn)樯嫌芜^(guò)濾器的調(diào)用總在堆棧上,等待后續(xù)調(diào)用的返回)。

          過(guò)濾的實(shí)現(xiàn)

          調(diào)用鏈
          所有過(guò)濾器都服從調(diào)用的過(guò)濾器鏈,并通過(guò)定義明確的接口得到執(zhí)行。一個(gè)執(zhí)行過(guò)濾器的 Java 類必須執(zhí)行這一
          javax.servlet.Filter 接口。這一接口含有三個(gè)過(guò)濾器必須執(zhí)行的方法:

          • doFilter(ServletRequest, ServletResponse, FilterChain):這是一個(gè)完成過(guò)濾行為的方法。這同樣是上游過(guò)濾器調(diào)用的方法。引入的FilterChain對(duì)象提供了后續(xù)過(guò)濾器所要調(diào)用的信息。
          • init(FilterConfig):這是一個(gè)容器所調(diào)用的初始化方法。它保證了在第一次doFilter()調(diào)用前由容器調(diào)用。您能獲取在 web.xml 文件中指定的初始化參數(shù)。
          • destroy():容器在破壞過(guò)濾器實(shí)例前,doFilter()中的所有活動(dòng)都被該實(shí)例終止后,調(diào)用該方法。

          嵌套調(diào)用在 doFilter() 方法執(zhí)行中發(fā)生。除非您建立一個(gè)過(guò)濾器明確阻止所有后續(xù)處理(通過(guò)其它過(guò)濾器及資源處理器),否則過(guò)濾器一定會(huì)在 doFilter 方法中作以下的調(diào)用:

          FilterChain.doFilter(request, response);

           

          安裝過(guò)濾器:定義與映射
          容器通過(guò) Web 應(yīng)用程序中

          的配置描述符 web.xml 文件了解過(guò)濾器。有兩個(gè)新的標(biāo)記與過(guò)濾器相關(guān):<filter><filter-mapping>。應(yīng)該指定它們?yōu)?span lang="EN-US"> web.xml 文件內(nèi) <web-app> 標(biāo)記的子標(biāo)記。

          過(guò)濾器定義的元素
          <filter> 標(biāo)記是一個(gè)過(guò)濾器定義,它必定有一個(gè) <filter- name><filter-class> 子元素。<filter-name> 子元素給出了一個(gè)與過(guò)濾器實(shí)例相關(guān)的、基于文本的名字。<filter-class> 指定了由容器載入的實(shí)際類。您能隨意地包含一個(gè) <init-param> 子元素為過(guò)濾器實(shí)例提供初始化參數(shù)。例如,下面的過(guò)濾器定義指定了一個(gè)叫做 IE Filter 的過(guò)濾器:

          一、使瀏覽器不緩存頁(yè)面的過(guò)濾器     
          import javax.servlet.*;    
          import javax.servlet.http.HttpServletResponse;    
          import java.io.IOException;    
             
          /**   
          * 用于的使 Browser 不緩存頁(yè)面的過(guò)濾器   
          */   
          public class ForceNoCacheFilter implements Filter {    
             
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException    
          {    
              ((HttpServletResponse) response).setHeader("Cache-Control","no-cache");    
              ((HttpServletResponse) response).setHeader("Pragma","no-cache");    
              ((HttpServletResponse) response).setDateHeader ("Expires", -1);    
              filterChain.doFilter(request, response);    
          }    
             
          public void destroy()    
          {    
          }    
                public void init(FilterConfig filterConfig) throws ServletException    
          {    
          }    
          }    
          二、檢測(cè)用戶是否登陸的過(guò)濾器
          1.寫個(gè)過(guò)濾器
          import javax.servlet.Filter;   
        1. import javax.servlet.FilterConfig;   
        2. import javax.servlet.ServletException;   
        3. import javax.servlet.ServletRequest;   
        4. import javax.servlet.ServletResponse;   
        5. import javax.servlet.FilterChain;   
        6. import java.io.IOException;   
        7. import javax.servlet.http.HttpServletRequest;   
        8. import javax.servlet.http.HttpSession;   
        9. import javax.servlet.http.HttpServletResponse;   
        10.   
        11. public class RightFilter   
        12.     implements Filter {   
        13.   public void init(FilterConfig filterConfig) throws ServletException {   
        14.   }   
        15.   
        16.   public void doFilter(ServletRequest request, ServletResponse response,   
        17.                        FilterChain chain) throws IOException, ServletException {   
        18.     HttpServletRequest req = (HttpServletRequest) request;   
        19.     HttpServletResponse res = (HttpServletResponse) response;   
        20.        
        21.     HttpSession session = req.getSession(true);   
        22.   
        23.     //從session里取的用戶名信息   
        24.     String username = (String) session.getAttribute("username");   
        25.        
        26.     //判斷如果沒(méi)有取到用戶信息,就跳轉(zhuǎn)到登陸頁(yè)面   
        27.     if (username == null || "".equals(username)) {   
        28.       //跳轉(zhuǎn)到登陸頁(yè)面   
        29.       res.sendRedirect("http://"+req.getHeader("Host")+"/login.jsp");   
        30.     }   
        31.     else {   
        32.       //已經(jīng)登陸,繼續(xù)此次請(qǐng)求   
        33.       chain.doFilter(request,response);   
        34.     }   
        35.   }   
        36.   
        37.   public void destroy() {   
        38.   }   
        39. }   

          2.然后在web.xml里配置需要登陸權(quán)限驗(yàn)證的JSP文件:   
           a.如果是某個(gè)具體的JSP文件(如a.jsp)需要登陸驗(yàn)證

          <web-app>
            
            
          <filter>
              
          <filter-name>right</filter-name>
              
          <filter-class>com.taihuatalk.taihua.common.RightFilter</filter-class>
            
          </filter>

            
          <filter-mapping>
              
          <filter-name>right</filter-name>
              
          <url-pattern>/a.jsp</url-pattern>
            
          </filter-mapping>
            
          </web-app>

             b.如果是某一個(gè)目錄(如a/目錄)整個(gè)目錄下的文件都需要登陸驗(yàn)證:

          <web-app>
            
            
          <filter>
              
          <filter-name>right</filter-name>
              
          <filter-class>com.taihuatalk.taihua.common.RightFilter</filter-class>
            
          </filter>

            
          <filter-mapping>
              
          <filter-name>right</filter-name>
              
          <url-pattern>/a/*</url-pattern>
            </filter-mapping>
            
          </web-app>
          三、字符編碼的過(guò)濾器    
          import javax.servlet.*;    
          import java.io.IOException;    
             
          /**   
          * 用于設(shè)置 HTTP 請(qǐng)求字符編碼的過(guò)濾器,通過(guò)過(guò)濾器參數(shù)encoding指明使用何種字符編碼,用于處理Html Form請(qǐng)求參數(shù)的中文問(wèn)題   
          */   
          public class CharacterEncodingFilter    
          implements Filter    
          {    
          protected FilterConfig filterConfig = null;    
          protected String encoding = "";    
             
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException    
          {    
                    if(encoding != null)    
                     servletRequest.setCharacterEncoding(encoding);    
                    filterChain.doFilter(servletRequest, servletResponse);    
          }    
             
          public void destroy()    
          {    
              filterConfig = null;    
              encoding = null;    
          }    
             
                public void init(FilterConfig filterConfig) throws ServletException    
          {    
                     this.filterConfig = filterConfig;    
                    this.encoding = filterConfig.getInitParameter("encoding");    
             
          }    
          }    

          2、在web.xml中做一些設(shè)置
           <filter>
               <filter-name>code</filter-name>
               <filter-class>CharacterEncodingFilter</filter-class>
          <init-param>
               <param-name>encoding</param-name>
               <param-value>GBK</param-value>
          </init-param>
          </filter>


            <filter-mapping>
               <filter-name>code</filter-name>
               <url-pattern>/*</url-pattern>
           </filter-mapping>


        40. posted on 2010-01-13 23:18 fly 閱讀(8310) 評(píng)論(0)  編輯  收藏 所屬分類: jsp學(xué)習(xí)
          主站蜘蛛池模板: 内黄县| 清河县| 庆云县| 临桂县| 工布江达县| 紫金县| 陇南市| 建宁县| 镇远县| 石屏县| 石嘴山市| 阿瓦提县| 伊金霍洛旗| 常宁市| 丘北县| 九寨沟县| 望江县| 德惠市| 资中县| 衡水市| 清涧县| 虎林市| 白水县| 南乐县| 宜兰市| 全州县| 南充市| 临夏县| 乌兰察布市| 英山县| 子长县| 和政县| 姚安县| 民勤县| 清原| 札达县| 西昌市| 宜宾县| 栾川县| 临泉县| 视频|