posts - 19,  comments - 4,  trackbacks - 0
          Servlet filter簡介

          本篇文章只是一篇學習筆記,其中參考了許多文章。

          一:簡介

          filter(過濾器)是servlet2.3中增加的一個新功能,filter可以改變一個請求(request)或者是修改響應(response)。filter不是一個servlet,它只是一個servlet接受到請求前的預處理器。就是說,用戶發送一個請求給servlet時,在servlet處理之前,這個filter首先執行,然后才是servlet的執行。

          二:作用

          filter可以用在下面幾個方面

          1:訪問特定資源(Web 頁、JSP 頁、servlet)時的身份認證
          2:訪問資源的記錄

          3:訪問資源的轉換

          三:編寫filter

          一個filter 必須實現javax.servlet.Filter 接口,即實現下面的三個方法:


          1:void init(FilterConfig config) throws ServletException: 初始化方法
          2:void destroy():
          3:void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具體的過濾工作。

          四:示例

          示例一:限制訪問資源

          我們以參考文獻1中的第一個例子介紹怎樣限制用戶訪問特定的資源

          在那個例子中,對瀏覽器為IE的用戶做了限制,原文講的很清楚,關鍵代碼如下:

          CODE

          ?1import?java.io.*;
          ?2import?javax.servlet.*;
          ?3import?javax.servlet.http.*;
          ?4
          ?5public?final?class?IEFilter?implements?Filter?{
          ?6
          ?7????private?FilterConfig?filterConfig?=?null;
          ?8
          ?9????public?void?doFilter(ServletRequest?request,?ServletResponse?response,
          10?????????????????????????FilterChain?chain)
          11????throws?IOException,?ServletException?{
          12??????String?browserDet?=?((HttpServletRequest)?request).getHeader("User-Agent").toLowerCase();
          13
          14??????if?(?browserDet.indexOf("msie")?!=?-1)??{
          15????????????PrintWriter?out?=?response.getWriter();
          16????????????out.println("<html><head></head><body>");
          17????????????out.println("<h1>Sorry,?page?cannot?be?displayed!</h1>");
          18????????????out.println("</body></html>");
          19????????????out.flush();
          20????????????return;
          21??????????}

          22
          23??????chain.doFilter(request,?response);
          24
          25????}

          26
          27????public?void?destroy()?{
          28????}

          29
          30????public?void?init(FilterConfig?filterConfig)?{
          31????this.filterConfig?=?filterConfig;
          32????}



          看看doFilter的參數可知,利用request和response我們可以對做各種處理。例如可以通過ServletRequest類的getRemoteAddr()方法得到訪問這個應用的客戶端ip,然后對這個ip作一些處理,如果不符合條件,可以限制訪問。這樣可以很好的保護應用。

          示例二:資源轉換

          參考文獻一中的第二個例子演示了怎樣將用戶要訪問的資源進行轉換。

          示例三:訪問記錄

          類似于一個跟蹤程序,參考文獻二中的第二個例子演示了怎樣記錄用戶訪問的所有屬于同一個應用的資源。

          五:配置

          以tomcat為例:每個使用filter的應用的web.xml類似下面
          CODE
          ?1<web-app>?
          ?2????<filter>
          ?3????????<filter-name>Filter</filter-name>?//這里是Filter的名字,隨便你怎么起
          ?4????????<filter-class>FilterClass</filter-class>?//Filter的類名,注意包含package
          ?5????</filter>
          ?6
          ?7????<filter-mapping>
          ?8????????<filter-name>Filter</filter-name>//與上面的保持一致
          ?9????????<url-pattern>/*</url-pattern>?//對所有資源應用此filter
          10????</filter-mapping>
          11</web-app>

          如果一個應用有多個Filter,則在web.xml文件中,<filter-mapping>靠前的filter先執行。

          六:測試

          可以把參考文獻一和二中的代碼中的war文件放到tomcat\webapp目錄下,啟動tomcat,用類似http://localhost:8080/clickstream(此乃文獻二中第二個例子的訪問方法)訪問。

          這只是一篇筆記,要想真正理解filter,建議讀下面兩篇文章。

          參考文獻

          1:Tomcat 的過濾訣竅
          2:Filter code with Servlet 2.3 model
          posted on 2007-01-05 13:44 公主她爹 閱讀(330) 評論(0)  編輯  收藏 所屬分類: Servlet Filter

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類(19)

          隨筆檔案(19)

          相冊

          娛樂網站

          技術網站(Java)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 登封市| 八宿县| 凤凰县| 墨竹工卡县| 抚顺市| 乐亭县| 琼海市| 元谋县| 贡山| 本溪市| 沛县| 杭州市| 图们市| 旌德县| 万载县| 宝山区| 和龙市| 收藏| 德钦县| 古蔺县| 沂水县| 铜陵市| 镇沅| 香格里拉县| 无棣县| 深州市| 三台县| 海安县| 施秉县| 嘉善县| 资源县| 抚远县| 宣威市| 宁波市| 山阳县| 民和| 翁牛特旗| 太康县| 英德市| 易门县| 彭州市|