Servlet過濾器機制分析及應用李德水(渭南師范學院計算機科學系,陜西渭南714000)摘要:Servlet過濾器是可重用的Web組件,是一種類似于Servlet由容器管理的對象,能夠以聲明的方式插入到HTTP請求、響應的過程中,具有功能強大、通過Web部署描述符(web.xml)配置文件配置組件的特點。它實現了對Web應用程序的預處理和后期處理邏輯,在應用程序中得到了大量的應用。文章詳細分析了過濾器的工作原理、相關的API及工作流程,并結合實例介紹了過濾器的設計與配置。關鍵詞:Servlet;Servlet過濾器;HTTP請求/響應;過濾器鏈引言Servlet過濾器是J2EE Web應用程序級的java代碼組件,是一種類似于Servlet,由容器管理的對象,它能夠以聲明的方式插人到HTTP請求響應的過程中。它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和服務器之間交換的數據。它是通常封裝了一些功能的類,實現了對Web應用程序中的預處理和后期處理邏輯。過濾器提供一種面向對象的模塊化機制,用以將公共任務封裝到可插入的組件中。這些組件通過Web部署描述符(web.xml)配置文件來聲明,可以方便地添加和刪除過濾器,無需改動任何應用程序代碼或jsp頁面,并由Servlet容器進行動態調用。通過在請求/響應鏈中使用過濾器,可以對應用程序(而不是以任何方式替代)的Servlet或JSP頁面提供的核心處理進行補充,而不會破壞Servlet或JSP頁面的功能。由于是純Java實現,所以Servlet過濾器是跨平臺和跨容器可移植的,從而進一步支持了Servler過濾器的模塊化和可重用性,使得它們很容易地被部署到任何相容的J2EE環境中。1 Servlet過濾器體系結構1.1過濾器工作原理 當客戶端發出Web資源的請求時,Web服務器根據應用程序配置文件設置的過濾規則進行檢查,客戶請求滿足過濾規則,則對客戶請求/響應進行攔截,對請求頭和請求數據進行檢查或改動,并依次通過過濾器鏈,最后把請求/響應交給請求的Web資源處理。請求信息在過濾器鏈中可以被修改,也可以根據條件讓請求不發往資源處理器,并直接向客戶機發回一個響應。當資源處理器完成了對資源的處理后,響應信息將逐級逆向返回。同樣在這個過程中,用戶可以修改響應信息,從而完成一定的任務。如圖1所示:在Servlet2.4規范中,對2.3規范進行了擴展,使得Servlet過濾器可以應用在客戶機和Servlet之間,Servlet和Servlet或JSP頁面之間,以及各個JSP頁面之間。1.2 Servlet過濾器APIServlet過濾器API包含了3個接口,它們都在javax.servlet包中,分別是Filter接口、FilterChain接口和FilterConfig接口。1.2.1 public Interface Filter所有的過濾器都必須實現Filter接口。該接口定義了init(),doFilter(),destory()三個方法:⑴public void init(FilterConfig filterConfig)throwsServletException.當開始使用servlet過濾器服務時,Web容器調用此方法一次,為服務準備過濾器;然后在需要使用過濾器的時候調用doFilter(),傳送給此方法的FilterConfig對象,包含servlet過濾器的初始化參數。⑵public void doFilter(ServletRequest request,ServletRe-sponse response,FilterChain chain)throws java.io.IOException,ServletException.每個過濾器都接受當前的請求和響應,而FilterChain包含的過濾器則仍然必須被處理。doFilter()方法中,過濾器可以對請求和響應做它想做的一切,通過調用他們的方法收集數據,或者給對象添加新的行為。過濾器通過傳送至此方法的FilterChain參數,調用chain.doFilter()將控制權傳送給下一個過濾器。當這個調用返回后,過濾器可以在它的doFilter()方法的最后對響應做些其他的工作。如果過濾器想要終止請求的處理或得到對響應的完全控制,則可以不調用下一個過濾器,而將其重定向至其它一些頁面。當鏈中的最后一個過濾器調用chain.doFilter()方法時,將運行最初請求的Servlet。⑶public void destroy()一旦doFilter()方法里的所有線程退出或已超時,容器調用此方法。服務器調用destory()以指出過濾器已結束服務,用于釋放過濾器占用的資源。1.2.2 public interface FilterChain方法public void doFilter(ServletRequest request,Servle-tResponse response)throws java.io.IOException,ServletException是由Servlet容器提供給開發者的,用于對資源請求過濾鏈的依次調用,通過FilterChain調用過濾鏈中的下一個過濾器,如果是最后一個過濾器,則下一個就調用目標資源。1.2.3 public interface FilterConfigFilterConfig接口檢索過濾器名、初始化參數以及活動的Servlet上下文。該接口提供了以下4個方法:⑴public java.lang.String getFilterName()返回web.xml部署文件中定義的該過濾器的名稱。⑵public ServletContext getServletContext()返回調用者所處的servlet上下文。⑶public java.lang.String getInitParameter(java.lang.Stringname)返回過濾器初始化參數值的字符串形式,當參數不存在時,返回null.name初始化參數名。⑷public java.util.Enumeration getInitParameterNames()以Enumeration形式返回過濾器所有初始化參數值,如果沒有初始化參數,返回為空。1.3過濾器相關接口工作流程從編程的角度看,過濾器類將實現Filter接口,然后使用這個過濾器類中的FilterChain和FilterConfig接口。該過濾器類的一個引用將傳遞給FilterChain對象,以允許過濾器把控制權傳遞給鏈中的下一個資源。FilterConfig對象將由容器提供給過濾器,以允許訪問該過濾器的初始化數據。詳細流程如圖2所示。 1.4過濾器配置過濾器通過Web應用程序中的配置描述符web.xml文件中的XML標簽來聲明,包括兩個部分:第一部分是過濾器定義,由元素表示,主要包括和兩個必需的子元素和、、、這4個可選的子元素。子元素定義了一個過濾器的名字,指定了由容器載入的實際類,子元素為過濾器實例提供初始化參數。另一部分是對過濾器過濾規則的配置,由元素表示,主要由、和子元素組成。將過濾器映射到一個或多個Servlet,將過濾器映射到一個或多個任意特征的URL的JSP頁面。2 應用實例從上面分析可知,實現Servlet過濾器,需要兩步:第一步開發過濾器,設計一個實現Filter接口的類;第二步通過web.xml配置過濾器,實現過濾器和Servlet、JSP頁面之間的映射。以下設計一個簡單的ip地址過濾器,根據用戶的IP地址進行對網站的訪問控制。⑴過濾器類的設計ipfilter.java 注意:chain.doFilter()語句以前的代碼用于對客戶請求的處理;以后的代碼用于對響應進行處理。⑵配置過濾器在應用程序Web-INF目錄下的web.xml描述符文件中添加以下代碼: 3 結束語Servlet過濾器功能強大,應用廣泛,除支持Servlet和JSP頁面的基本功能,比如日志記錄、性能、安全、會話處理、XSLT轉換等外,在J2EE應用程序中使用Java Servlet過濾器轉換其輸出,以便兼容任何類型客戶端也表現出了很好的前景。Servlet過濾器能夠偵測到來自使用WAP協議(無線應用協議)的移動客戶端的呼叫,并且將答復內容轉換成WML(無線標記語言)格式。Servlet過濾器也能檢測到來自iMode無線客戶的呼叫,并將其轉變成cHTML(緊湊HTML)格式等等。因而,深刻理解Servlet過濾器的工作機制,熟練掌握編程技術,在實際的開發過程中,可以不斷地發現新的用途,增強組件的可重用性,提高Web應用程序的可維護性。參考文獻:[1]Sun Microsystems.Java Servlet 2.4 Specification.http://jcp.org/aboutJava/communityPRocess/first/jsr154.2002.8.[2]陳敏,唐溢鍵,周新志.用Servlet過濾器簡化中文的輸入和輸出[J].成都信息工程學院學報,2005.20(2):129~133[3]謝志華.深入Java Servlet網絡編程[M].西安電子科技大學出版社,2004.[4]柳永坡,劉雪梅,趙長海.JSP應用開發技術[M].人民郵電出版社,2005. |
轉載自:http://www.cnfilters.com/isoc-zl/shownews.asp?id=792
新聞熱點
疑難解答