Servlet與jsp與Filter的使用.doc_第1頁
Servlet與jsp與Filter的使用.doc_第2頁
Servlet與jsp與Filter的使用.doc_第3頁
Servlet與jsp與Filter的使用.doc_第4頁
Servlet與jsp與Filter的使用.doc_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

或許,servlet API的2.3版本中最重要的一個新功能就是能夠為servlet和jsp頁面定義過濾器。過濾器提供了某些早期服務器所支持的非標準“servlet鏈接”的一種功能強大且標準的替代品。過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。在這之后,過濾器可以作如下的選擇:l 以常規(guī)的方式調(diào)用資源(即,調(diào)用servlet或JSP頁面)。l 利用修改過的請求信息調(diào)用資源。l 調(diào)用資源,但在發(fā)送響應到客戶機前對其進行修改l 阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源,返回一個特定的狀態(tài)代碼或生成替換輸出。過濾器提供了幾個重要好處。首先,它以一種模塊化的或可重用的方式封裝公共的行為。你有30個不同的serlvet或JSP頁面,需要壓縮它們的內(nèi)容以減少下載時間嗎?沒問題:構(gòu)造一個壓縮過濾器(參閱第11節(jié)),然后將它應用到30個資源上即可。其次,利用它能夠?qū)⒏呒壴L問決策與表現(xiàn)代碼相分離。這對于JSP特別有價值,其中一般希望將幾乎整個頁面集中在表現(xiàn)上,而不是集中在業(yè)務邏輯上。例如,希望阻塞來自某些站點的訪問而不用修改各頁面(這些頁面受到訪問限制)嗎?沒問題:建立一個訪問限制過濾器(參閱第8節(jié))并把它應用到想要限制訪問的頁面上即可。最后,過濾器使你能夠?qū)υS多不同的資源進行批量性的更改。你有許多現(xiàn)存資源,這些資源除了公司名要更改外其他的保持不變,能辦到么?沒問題:構(gòu)造一個串替換過濾器(參閱第10節(jié)),只要合適就使用它。但要注意,過濾器只在與servlet規(guī)范2.3版兼容的服務器上有作用。如果你的Web應用需要支持舊版服務器,就不能使用過濾器。1 建立基本過濾器建立一個過濾器涉及下列五個步驟:1)建立一個實現(xiàn)Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過濾代碼(見第2步),init方法建立設置操作,而destroy方法進行清楚。2)在doFilter方法中放入過濾行為。doFilter方法的第一個參數(shù)為ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數(shù)據(jù)、cookie和HTTP請求頭)的完全訪問。第二個參數(shù)為ServletResponse,通常在簡單的過濾器中忽略此參數(shù)。最后一個參數(shù)為FilterChain,如下一步所述,此參數(shù)用來調(diào)用servlet或JSP頁。3)調(diào)用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作為它的一個參數(shù)。在調(diào)用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯(lián),則servlet或JSP頁面被激活。4)對相應的servlet和JSP頁面注冊過濾器。在部署描述符文件(web.XML)中使用filter和filter-mapping元素。5)禁用激活器servlet。防止用戶利用缺省servlet URL繞過過濾器設置。1.1 建立一個實現(xiàn)Filter接口的類所有過濾器都必須實現(xiàn)Javax.servlet.Filter。這個接口包含三個方法,分別為doFilter、init和destroy。l public void doFilter(ServletRequset request, ServletResponse response, FilterChain chain) thows ServletException, IOException每當調(diào)用一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執(zhí)行其doFilter方法。正是這個方法包含了大部分過濾邏輯。第一個參數(shù)為與傳入請求有關的ServletRequest。對于簡單的過濾器,大多數(shù)過濾邏輯是基于這個對象的。如果處理HTTP請求,并且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對象構(gòu)造成HttpServletRequest。第二個參數(shù)為ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個參數(shù)。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可調(diào)用response.getWriter并直接發(fā)送一個響應到客戶機。第7節(jié)給出詳細內(nèi)容,第8節(jié)給出一個例子。其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有發(fā)送到它的輸出的對象中。然后,在調(diào)用serlvet或JSP頁面后,過濾器可檢查輸出,如果合適就修改它,之后發(fā)送到客戶機。詳情請參閱第9節(jié)。DoFilter的最后一個參數(shù)為FilterChain對象。對此對象調(diào)用doFilter以激活與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調(diào)用激活servlet或JSP本身。l public void init(FilterConfig config) thows ServletExceptioninit方法只在此過濾器第一次初始化時執(zhí)行,不是每次調(diào)用過濾器都執(zhí)行它。對于簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,F(xiàn)ilterConfig對象提供對servlet環(huán)境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個字段中,以便doFilter方法能夠訪問servlet環(huán)境或過濾器名。這種處理在第3節(jié)描述。其次,F(xiàn)ilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參數(shù)。初始化參數(shù)的使用在第5節(jié)中描述。l public void destroy( )此方法在利用一個給定的過濾器對象永久地終止服務器(如關閉服務器)時調(diào)用。大多數(shù)過濾器簡單地為此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的文件或數(shù)據(jù)庫連接池等清除任務。1.2 將過濾行為放入doFilter方法doFilter方法為大多數(shù)過濾器地關鍵部分。每當調(diào)用一個過濾器時,都要執(zhí)行doFilter。對于大多數(shù)過濾器來說,doFilter執(zhí)行的步驟是基于傳入的信息的。因此,可能要利用作為doFilter的第一個參數(shù)提供的ServletRequest。這個對象常常構(gòu)造為HttpServletRequest類型,以提供對該類的更特殊方法的訪問。1.3 調(diào)用FilterChain對象的doFilter方法Filter接口的doFilter方法以一個FilterChain對象作為它的第三個參數(shù)。在調(diào)用該對象的doFilter方法時,激活下一個相關的過濾器。這個過程一般持續(xù)到鏈中最后一個過濾器為止。在最后一個過濾器調(diào)用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。但是,鏈中的任意過濾器都可以通過不調(diào)用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調(diào)用JSP頁面的serlvet,并且中斷此調(diào)用過程的過濾器負責將輸出提供給客戶機。詳情請參閱第7節(jié)。1.4 對適當?shù)膕ervlet和JSP頁面注冊過濾器部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。1.filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:l icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。l filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。l display-name 這是一個可選的元素,它給出IDE使用的短名稱。l description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。l filter-class 這是一個必需的元素,它指定過濾器實現(xiàn)類的完全限定名。l init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個過濾器元素可包含多個init-param元素。請注意,過濾是在serlvet規(guī)范2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3版本。下面介紹一個簡單的例子: MyFilter myPackage.FilterClass . 2.filter-mapping元素filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素:l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。下面舉一個例子: MyFilter myPackage.FilterClass MyFilter /someDirectory/SomePage.jsp 1.5 禁用激活器servlet在對資源應用過濾器時,可通過指定要應用過濾器的URL模式或servlet名來完成。如果提供servlet名,則此名稱必須與web.xml的servlet元素中給出的名稱相匹配。如果使用應用到一個serlvet的URL模式,則此模式必須與利用web.xml的元素servlet-mapping指定的模式相匹配。但是,多數(shù)服務器使用“激活器servlet”為servlet體統(tǒng)一個缺省的URL:http:/host/WebAppPrefix/servlet/ServletName。需要保證用戶不利用這個URL訪問servlet(這樣會繞過過濾器設置)。例如,假如利用filter和filter-mapping指示名為SomeFilter的過濾器應用到名為SomeServlet的servlet,則如下: SomeFilter somePackage.SomeFilterClass SomeFilter SomeServlet 接著,用servlet和servlet-mapping規(guī)定URL http:/host/webAppPrefix/Blah 應該調(diào)用SomeSerlvet,如下所示: SomeFilter somePackage.SomeFilterClass SomeFilter /Blah 現(xiàn)在,在客戶機使用URL http:/host/webAppPrefix/Blah 時就會調(diào)用過濾器。過濾器不應用到http:/host/webAppPrefix/servlet/SomePackage.SomeServletClass。盡管有關閉激活器的服務器專用方法。但是,可移植最強的方法時重新映射Web應用鐘的/servlet模式,這樣使所有包含此模式的請求被送到相同的servlet中。為了重新映射此模式,首先應該建立一個簡單的servlet,它打印一條錯誤消息,或重定向用戶到頂層頁。然后,使用servlet和servlet-mapping元素發(fā)送包含/servlet模式的請求到該servlet。程序清單9-1給出了一個簡短的例子。程序清單9-1 web.xml(重定向缺省servlet URL的摘錄) Error somePackage.ErrorServlet Error /servlet/* 2 樣例:報告過濾器趁熱打鐵,我們來試驗一個簡單的過濾器,只要調(diào)用相關的servlet或JSP頁面,它就打印一條消息到標準輸出。為了完成此任務,相應的過濾器必須具有下面的內(nèi)容:1)實現(xiàn)Filter接口的一個類。這個類名為ReportFilter,如程序清單9-2所示。這個類對init和destroy方法提供空體。2)在doFilter方法中過濾行為。每當調(diào)用與這個過濾器相關的servlet或JSP頁面時,doFilter方法就生成一個打印輸出,此輸出列出請求主機和調(diào)用的URL。因為getRequestURL方法位于HttpServletRequest而不是ServletRequest中,所以把ServletRequest對象構(gòu)造為HttpServletRequest類型。3)調(diào)用FilterChain的doFilter方法。在打印輸出報告后,過濾器調(diào)用FilterChain的doFilter方法激活servlet或JSP頁面(如果有的話,調(diào)用下一個過濾器)4)對Web應用主頁和顯示TodaysSpecialservlet進行注冊。首先,filter元素將名稱Reporter與類moreservlets.filters.ReportFilter相關聯(lián)。然后,filter-mapping元素使用/index.jsp的url-pattern將過濾器與主頁相關聯(lián)。最后,filter-mapping元素使用TodaysSpecial的servlet-name將過濾器與TodaysSpecialservlet(名稱TodaysSpecial是在servlet元素中聲明的)相關聯(lián)。參見程序清單9-3。5)禁用激活器servlet。首先,建立一個RedirectorServlet(見程序清單9-6),它把接收到的所有請求重定向到此Web應用的主頁。接著,利用servlet和servlet-mapping元素(參見程序清單9-3)指定所有以http:/host/webAppPrefix/servlet/ 開始的URL都應該激活RedirectorServlet。給出這些設置后,每當客戶機請求此Web應用主頁(程序清單9-4)或TodaysSpecialservlet(程序清單9-5)時,都調(diào)用此過濾器。程序清單9-2 ReportFilter.java package moreservlets.filters;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*; / For Date class/* Simple filter that prints a report on the standard output* each time an associated servlet or JSP page is Accessed.*/ public class ReportFilter implements Filter public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException HttpServletRequest req = (HttpServletRequest)request; System.out.println(req.getRemoteHost() + tried to access + req.getRequestURL() + on + new Date() + .); chain.doFilter(request,response); public void init(FilterConfig config) throws ServletException public void destroy() 程序清單9-3 web.xml(針對報告過濾器的摘錄) Reporter moreservlets.filters.ReportFilter Reporter /index.jsp Reporter TodaysSpecial TodaysSpecial moreservlets.TodaysSpecialServlet TodaysSpecial /TodaysSpecial Redirector /servlet/* posted on 2004-07-02 17:07 khan 閱讀(287) 評論(1) 編輯 收藏 - 評論# re: servlet和JSP過濾器Filter 程序清單9-4 index.jspFilters R Us Filters R Us We specialize in the following: Air filters Coffee filters Pump filters Camera lens filters Image filters for Adobe Photoshop Web content filters Kalman filters Servlet and JSP filtersCheck out Todays Special.程序清單9-5 TodaysSpecialServlet.javapackage moreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;/* Sample servlet used to test the simple filters. */public class TodaysSpecialServlet extends HttpServlet private String title, picture; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException updateSpecials(); response.setContentType(text/html); PrintWriter out = response.getWriter(); String docType = n; out.println (docType + n + Todays Specialn + n + n + Todays Special: + title + s!n + n + n + Special deal: for only twice the price, you cann + buy one, get one free!.n + ); / Rotate among the three available filter images. private void updateSpecials() double num = Math.random(); if (num 0.333) title = Air Filter; picture = air-filter.jpg; else if (num 0.666) title = Coffee Filter; picture = coffee-filter.gif; else title = Pump Filter; picture = pump-filter.jpg; 程序清單9-6 RedirectorServlet.javapackage moreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;/* Servlet that simply redirects users to the* Web application home page. Registered with the* default servlet URL to prevent clients from* using http:/host/webAppPrefix/servlet/ServletName* to bypass filters or security settings that* are associated with custom URLs.*/public class RedirectorServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.sendRedirect(request.getContextPath(); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response); 3 從過濾器中訪問servlet環(huán)境前一節(jié)的ReportFilter只要調(diào)用指定的servlet或JSP頁面,就在標準輸出上打印一個報告。當你在自己的桌面系統(tǒng)上運行一個服務器時,一般會用一個顯示標準輸出的窗口,在開發(fā)過程中,標準輸出上的報告很好用。但在部署過程中,不可能訪問這個窗口。因此,一種自然的改進是將報告寫入servlet日志文件寫到標準輸出。Servlet API提供了兩個log方法:一個取一個簡單的String而另一個取一個String和一個Throwable。這兩個方法都可以從GenericServlet或ServletContext類中使用。關于這兩個方法所用的日志文件的準確位置,請查看相關服務器的幫助文檔。問題是doFilter方法在與其相關的serlvet或JSP頁面之前執(zhí)行。因此,你不能訪問該servlet的實例,從而不能調(diào)用從GenericServlet繼承的log方法。此外,API沒有體統(tǒng)從doFilter方法中訪問ServletContext的簡單方法??梢栽L問ServletContext的方法并且與過濾器相關的唯一類是FilterConfig,訪問ServletContext的方法為getServletContext。FilterConfig對象被傳輸給init方法,但不會自動存放到doFilter可使用的某個位置。因此,你必須自己存放FilterConfig??山⒁粋€FilterConfig類型的字段,然后重載init,將它的參數(shù)分配給該字段。因為一般只使用FilterConfig對象來訪問ServletContext和過濾器名,所以可以存放該ServletContext和名稱在字段中。相面舉一個例子: public class SomeFilter implements Filter protected FilterConfig config; private ServletContext context; private String filterName; public void init(FilterConfig config) throws ServletException this.config = config; / In case it is needed by subclass. context = config.getServletContext(); filterName = config.getFilterName(); / doFilter and destroy methods. 4 例子:日志記錄過濾器我們來更新ReportFilter(程序清單9-2),以便消息進入日志文件而不是標準輸出。為了完成這個任務,過濾器應該具有下列內(nèi)容:1)實現(xiàn)Filter接口的一個類。這個類名為LogFilter,如程序清單9-7所示。這個類的init方法在過濾器的字段中存放FilterConfig、ServletContext和過濾器名。它對destory方法提供一個空體。2)在doFilter方法中過濾行為。這個行為和ReportFilter的行為之間有兩點不同:報告放于日志文件中而不是標準輸出中,報告包括過濾器的名稱。3)調(diào)用FilterChain的doFilter方法。在打印出報告后,此過濾器調(diào)用FilterChain的doFilter方法激活鏈中的下一個過濾器(如果沒有更多的過濾器,則激活servlet或JSP頁面)。4)對所有URL進行注冊。首先,filter元素將名稱LogFilter與類moreservlets.filters.LogFilter相關聯(lián)。接著,filter-mapping元素使用值為/*的url-pattern將此過濾器與Web應用中所有URL相關聯(lián)。參看程序清單9-8。5)禁用激活servlet。這個操作已經(jīng)在第2節(jié)介紹過,這里就不再重復了。當這個Web應用部署在一個外部服務器上且附加了日志記錄過濾器后,客戶機對此Web應用主頁的請求將在日志文件中產(chǎn)生一個項,如:“ tired to acces /filters/index.jsp on Fri Oct 26 15:16:15 EDT 2001.(Reported by Logger.)”。程序清單9-7 LogFilter.javapackage moreservlets.filters;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*; / For Date class/* Simple filter that prints a report in the log file* whenever the associated servlets or JSP pages* are accessed.*/public class LogFilter implements Filter protected FilterConfig config; private ServletContext context; private String filterName; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException HttpServletRequest req = (HttpServletRequest)request; context.log(req.getRemoteHost() + tried to access + req.getRequestURL() + on + new Date() + . + (Reported by + filterName + .); chain.doFilter(request,response); public void init(FilterConfig config) throws ServletException this.config = config; / In case it is needed by subclasscontext = config.getServletContext(); filterName = config.getFilterName(); public void destroy() 程序清單9-8 web.xml(針對日志記錄過濾器的摘錄) Logger moreservlets.filters.LogFilter Logger /* 5 利用過濾器的初始化參數(shù)對于servlet和JSP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論