java web課件 第6章_第1頁
java web課件 第6章_第2頁
java web課件 第6章_第3頁
java web課件 第6章_第4頁
java web課件 第6章_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 過濾器Filter,Java Web程序設(shè)計基礎(chǔ),6.1 Filter概述,什么是Filter Filter接口 Filter配置,6.1.1 什么是Filter,應(yīng)用程序中經(jīng)常會有對于多個請求或會話都需要的任務(wù),這種情況就需要使用過濾器(Filter) 過濾器處于客戶端和底層Web應(yīng)用程序之間,可以使用過濾器檢查與修改二者之間的任何請求與響應(yīng),6.1.1 什么是Filter(續(xù)),過濾器是Web應(yīng)用程序組件并與Web應(yīng)用程序結(jié)構(gòu)綁定。 與其它的Web應(yīng)用程序組件不同,過濾器被鏈接到容器處理通道上。這意味著過濾器在servlet之前訪問進(jìn)入的請求,并且在返回給客戶端之前訪問流出的響應(yīng)

2、說明:過濾器也是Java類加入到Web應(yīng)用程序時與Servlet方式相同,過濾器工作原理,下圖顯示了過濾器在容器處理通道中的位置。過濾器在請求到達(dá)其訪問的資源之前截取進(jìn)入的請求,并在返回給客戶端之前截取流出的響應(yīng)。 通過合并過濾器完成的處理與Web資源完成的處理,建立一個新的獨(dú)立的處理單元。 圖中顯示了過濾器如何鏈接形成一個線性的處理 需要注意的是請求與響應(yīng)需要通過過濾器和而請求與響應(yīng)通過過濾器和,因此過濾器被用于所有的請求與響應(yīng)。,Filter生命周期,過濾器的生命周期與servlet的生命周期類似,一個過濾器有四個階段:實例化、初始化、過濾和清除。 容器會調(diào)用過濾器上的init()方法。在

3、init()方法調(diào)用完成之后,過濾器實例準(zhǔn)備處理同時發(fā)生的多個請求。 請求到過濾器通過doFilter()方法,類似于請求到servlet通過service()方法。,Filter生命周期(續(xù)),當(dāng)所有未完成的doFilter()方法完成返回后,容器將調(diào)用過濾器的destroy()方法。過濾器的方法調(diào)用完成后,過濾器會被認(rèn)為是未激活。每個實例的清除均在 destroy()方法中實現(xiàn),之后Java對象會使用垃圾回收。 一些容器因為性能的因素可能選擇實現(xiàn)過濾器實例緩沖池,這意味著一個過濾器實例的destroy()方法被調(diào)用后不久init()方法被再次調(diào)用。如果你將過濾器部署到帶有過濾器緩沖池的容器

4、中,就需要小心設(shè)計過濾器及其上的方法。,6.1.2 Filter接口,所有過濾器必須實現(xiàn)javax.servlet.Filter接口,其中定義了三個訪求: init() doFilter() destroy().,過濾器類與接口(一),容器調(diào)用init()方法初始化過濾器實例: public void init(FilterConfig config) throws ServletException 其中FilterConfig對象包含過濾器細(xì)節(jié)與容器的底層支持。下面的例子將演示如何使用此對象。,過濾器類與接口(二),doFilter()方法包含過濾器邏輯這與servlet中service()

5、方法包含的邏輯類似: public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 需要牢記的是同時對多個請求提供服務(wù)的過濾器只有一個實例(單態(tài))。這意味著任何共享變量(非本地)必須通過同步區(qū)域(synchronized blocks)來訪問。 FilterChain參數(shù)對正確的過濾器操作是十分重要的。必須調(diào)用FilterChain對象上的doFilter()方法,除非想要阻止更深一步的下級處理(換句話說,阻塞請求到與之相

6、關(guān)的底層的Web資源),過濾器類與接口(二)-2,在調(diào)用FilterChain上的方法之前的任何代碼被考慮過濾器邏輯的預(yù)處理。在此階段,進(jìn)入的請求有效但并未到Web資源。 在調(diào)用FilterChain上的方法之后的任何代碼被考慮形成過濾器邏輯的后繼處理。在這個階段,發(fā)出的響應(yīng)已包含由Web資源的完成的完整的響應(yīng)。 注意:FilterChain上的doFilter()方法的調(diào)用將會調(diào)用下一個過濾器 (當(dāng)使用過濾器鏈時) 或底層的Web資源。,過濾器類與接口(二)-3,任何的下級過濾器與底層Web資源的處理都發(fā)生在FilterChain上的doFilter()方法調(diào)用期間。請求的處理沒有包含在過濾

7、器中而是被包裝到調(diào)用FilterChain的doFilter方法。 這允許你做一些在其它完成請示-響應(yīng)攔截機(jī)制比較困難的任務(wù): 在預(yù)處理與后繼處理邏輯間共享變量十分方便。,過濾器類與接口(三),在容器消除過濾器實例之前將會調(diào)用destroy()方法: public void destroy(),6.1.3 Filter配置,本例會阻止來自某個IP地址的請求訪問pizza應(yīng)用程序,該地址的用戶可能信譽(yù)不佳。下面的建立的步驟: 1. 開始編寫過濾器. 創(chuàng)建一個新的文件夾在 WEB-INFclasses 命名為 filters. 創(chuàng)建下面的文件 AccessFilter.java, 并加入下面的代碼

8、:,Filter配置(二),. 將下面的內(nèi)容加入到web.xml文件中位于 元素之后與任何servlet定義之前: Access filters.AccessFilter Access /* ,Filter配置(三),. 建立denied.jsp文件位于Pizza文件夾,內(nèi)容如下: Access denied Access denied Sorry, you cannot order any more pizzas. Please pay your bills. ,Filter配置(四),.運(yùn)行結(jié)果如何? 啟動Tomcat,通過瀏覽器地址欄輸入URL http:/localhost:8080/

9、Pizza/pizza.jsp 通過客戶端瀏覽器訪問會被拒絕,因為是來處本機(jī)地址 ()。,Fiter說明(一),過濾器十分簡單,獲取過濾器的配置信息,包括對容器設(shè)置的許多引用: private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig) this.filterConfig = filterConfig; ,Fiter說明(二),過濾器生命周期中請求與響應(yīng)的處理 由doFilter()方法完成: public void doFilter(ServletRequest

10、request, ServletResponse response, FilterChain chain) throws IOException, ServletException ,Fiter說明(三),方法的開始部分 (也就是說,在調(diào)用FilterChain的方法doFilter()之前) 處理請求。想要拒絕來自某一地址上的所有用戶,本例中拒絕本機(jī)地址的用戶。如果IP地址與 匹配,那么轉(zhuǎn)發(fā)請求到denied.jsp頁面。這里通過FilterConfig對象使用了容器的底層完成轉(zhuǎn)發(fā): if(request.getRemoteAddr().equals()

11、filterConfig.getServletContext(). getRequestDispatcher(/denied.jsp). forward(request, response);,Fiter說明(四),如果請求不是來自本機(jī),調(diào)用FilterChain對象上的doFilter()方法并將請求傳遞給下面的鏈(在這種情況下,當(dāng)過濾器鏈中沒有其它的過濾器時才到Web資源): else chain.doFilter(request, response); 還要完成類的destroy()方法,該方法從內(nèi)存中刪除當(dāng)前配置對象:public void destroy() this.filterC

12、onfig = null; ,Fiter說明(五),部署過濾器與部署servlet一樣簡單。給過濾器指定一個名字和容器需要使用的類: Access filters.AccessFilter 然后需要通知容器對何種URL(URL模式)應(yīng)用過濾器: Access /* 可以使用子元素代替 ,將過濾器映射到指定名字的servlet,過濾初始化參數(shù),上面的示例顯示過濾器的主要功能但是不夠靈活,不具備即插即用的模塊特點(diǎn)。 過濾器類應(yīng)與其它類一樣遵循良好的編程實踐,開發(fā)者應(yīng)該避免在代碼中依靠手寫的字符串。 可以使用初始化參數(shù)來代替硬編碼的字符串參數(shù)。,實戰(zhàn)訓(xùn)練:使用過濾器初始化參數(shù)(一),將過濾器的手工編

13、碼的字符串移除 、加入下面粗休的代碼行到文件AccessFilter.java: public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException String ipAddress = filterConfig.getInitParameter(ipAddress); String deniedPage = filterConfig.getInitParameter(deniedPage); if(reques

14、t.getRemoteAddr().equals(ipAddress) filterConfig.getServletContext(). getRequestDispatcher(deniedPage).forward(request, response); else ,實戰(zhàn)訓(xùn)練:使用過濾器初始化參數(shù)(二),. 將下面粗體的內(nèi)容加入到文件web.xml: Access filters.AccessFilter ipAddress deniedPage /denied.jsp ,實戰(zhàn)訓(xùn)練:使用過濾器初始化參數(shù)(三),.運(yùn)行結(jié)果如何? 重新啟動Tomcat,重新嘗試訪問piz

15、za應(yīng)用程序與先前一樣訪問被拒絕了。,Filter初始化參數(shù)說明(一),添加到 web.xml 文件中的兩個初始化參數(shù)的名稱分別是 ipAddress 與 deniedPage,同樣在FilterConfig對象中也使用此名字訪問這些參數(shù): ipAddress deniedPage /denied.jsp ,Filter初始化參數(shù)說明(二),訪問初始化參數(shù)使用下面的代碼: String ipAddress = filterConfig.getInitParameter(ipAddress); String deniedPage = filterConfig.getInitParameter(deniedPage); 然后使用下面的代碼代替手工編碼的字符串: if(request.getRemoteAddr().equals(ipAddress) filterConfig.getServletContext(). getRequestDispatcher(deniedPage).forward(request, response); else ,過濾器鏈,可能存在將多個過濾器應(yīng)用到同一資源的情況。,用戶,過濾器1,過濾器2,過濾器3,Web 資源,過濾器鏈,過濾器鏈(續(xù)一),例如,下面的過濾器映射就會將AccessFilter 與 Lo

溫馨提示

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

評論

0/150

提交評論