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)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 托克托县| 织金县| 琼中| 台东县| 永川市| 射洪县| 长寿区| 石门县| 芦溪县| 柞水县| 长子县| 罗山县| 彭山县| 云林县| 右玉县| 平度市| 绥宁县| 富川| 工布江达县| 仁化县| 英山县| 兴文县| 常德市| 龙江县| 沛县| 曲阳县| 高雄市| 浪卡子县| 博客| 景洪市| 济阳县| 呼伦贝尔市| 杭锦后旗| 双鸭山市| 日喀则市| 灯塔市| 韶山市| 深泽县| 恩施市| 黑水县| 遵义县|