方立勛javawebservlet過濾器_第1頁
方立勛javawebservlet過濾器_第2頁
方立勛javawebservlet過濾器_第3頁
方立勛javawebservlet過濾器_第4頁
方立勛javawebservlet過濾器_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、高級軟件人才實(shí)作培訓(xùn)專家!Servlet Filter方立勛北京傳智播客教育高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter簡介 Filter也稱之為過濾器,它是Servlet技術(shù)中最激動人心的技術(shù),WEB開發(fā)人員通過Filter技術(shù),對web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級功能。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter簡介 Servlet API中提供了

2、一個Filter接口,開發(fā)web應(yīng)用時,如果編寫的Java類實(shí)現(xiàn)了這個接口,則把這個java類稱之為過濾器Filter。 通過Filter技術(shù),開發(fā)人員可以實(shí)現(xiàn)用戶在訪問某個目標(biāo)資源之前, 對訪問的請求和響應(yīng)進(jìn)行攔截,如下所示:web資源Jsp Servlet html過濾器北京傳智播客教育 Web服務(wù)器Web瀏覽器高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter是如何實(shí)現(xiàn)攔截的? Filter接口中有一個doFilter方法,當(dāng)開發(fā)人員編寫好Filter,并配置對哪個web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前,都會先調(diào)用一下filt

3、er的doFilter方法,因此,在該 方法內(nèi)編寫代碼可達(dá)到如下目的: 調(diào)用目標(biāo)資源之前,讓一段代碼執(zhí)行是否調(diào)用目標(biāo)資源(即是否讓用戶訪問web資源)。 web服務(wù)器在調(diào)用doFilter方法時,會傳遞一個filterChain對象進(jìn)來, filterChain對象是filter接口中最重要的一個對象,它也提供了一個doFilter方法,開發(fā)人員可以根據(jù)需求決定是否調(diào)用此方法,調(diào)用該方法,則web服務(wù)器就會調(diào)用web資源的service方法,即web資源就會被訪問,否則web資源不會被訪問。調(diào)用目標(biāo)資源之后,讓一段代碼執(zhí)行 實(shí)驗(yàn): Filter開發(fā),見下頁P(yáng)PT中的開發(fā)流程北京傳智播客教育 w

4、高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter開發(fā)入門 Filter開發(fā)分為二個步驟:編寫java類實(shí)現(xiàn)Filter接口,并實(shí)現(xiàn)其doFilter方法。在 web.xml 文件中使用和元素對編寫的filter 類進(jìn)行注冊,并設(shè)置它所能攔截的資源。(動手實(shí)驗(yàn)) Filter鏈 在一個web應(yīng)用中,可以開發(fā)編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。web服務(wù)器根據(jù)Filter在web.xml文件中的注冊順序,決定先調(diào)用哪個Filter,當(dāng)?shù)谝粋€Filter的doFilter方法被調(diào)用時,web服務(wù)器會創(chuàng)建一個代表Filter鏈的FilterCh

5、ain對象傳遞給該方法。在doFilter方法中, 開發(fā)人員如果調(diào)用了FilterChain對象的doFilter方法,則web服務(wù)器 會檢查FilterChain對象中是否還有filter,如果有,則調(diào)用第2個filter, 如果沒有,則調(diào)用目標(biāo)資源。Filter鏈實(shí)驗(yàn)(查看filterChain API文檔)北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip: Filter的生命周期 init(FilterConfig filterConfig)throws ServletException: 和我們編寫的Servlet程序一樣,F(xiàn)ilter的創(chuàng)建和銷毀由WEB服

6、務(wù)器負(fù)責(zé)。 web 應(yīng)用程序啟動時,web 服務(wù)器將創(chuàng)建Filter 的實(shí)例對象,并調(diào)用其init方法,完成對象的初始化功能,從而為后續(xù)的用戶請求作好攔截的準(zhǔn)備工作(注:filter對象只會創(chuàng)建一 次,init方法也只會執(zhí)行一次。示例 )開發(fā)人員通過init方法的參數(shù),可獲得代表當(dāng)前filter配置信息的FilterConfig對象。(filterConfig對象見下頁P(yáng)PT) destroy(): 在Web容器卸載 Filter 對象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個方法中,可以釋放過濾器使用的資源。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)

7、專家!Tip: FilterConfig接口 用戶在配置filter時,可以使用為filter配置一些 初始化參數(shù),當(dāng)web容器實(shí)例化Filter對象,調(diào)用其init方法 時,會把封裝了filter初始化參數(shù)的filterConfig對象傳遞進(jìn)來。因此開發(fā)人員在編寫filter時,通過filterConfig對象的方法, 就可獲得:String getFilterName():得到filter的名稱。String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數(shù)的值。如果不存在返回null.Enumeration getInitParamete

8、rNames():返回過濾器的所有初始化參數(shù)的名字的枚舉集合。public ServletContext getServletContext():返回Servlet上下文對象的引用。 實(shí)驗(yàn):得到filter配置信息北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter常見應(yīng)用(1) 統(tǒng)一全站字符編碼的過濾器 通過配置參數(shù)encoding指明使用何種字符編碼, 以處理Html Form請求參數(shù)的中文問題北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter常見應(yīng)用(2) 禁止瀏覽器緩存所有動態(tài)頁面的過濾器: 有 3 個 HT

9、TP 響應(yīng)頭字段都可以禁止瀏覽器緩存當(dāng)前頁面,它們在Servlet 中的示例代碼如下: response.setDateHeader(Expires,-1); response.setHeader(Cache-Control,no-cache); response.setHeader(Pragma,no-cache);并不是所有的瀏覽器都能完全支持上面的三個響應(yīng)頭,因此最好是同時使用上面的三個響應(yīng)頭。Expires數(shù)據(jù)頭:值為GMT時間值,為-1指瀏覽器不要緩存頁面Cache-Control響應(yīng)頭有兩個常用值: no-cache指瀏覽器不要緩存當(dāng)前頁面。 max-age:xxx指瀏覽器緩存頁面

10、xxx秒。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter常見應(yīng)用(3) 控制瀏覽器緩存頁面中的靜態(tài)資源的過濾器: 場景:有些動態(tài)頁面中引用了一些圖片或 css文件以修飾頁面效果,這些圖片和css文件經(jīng)常是不變化的,所以為減輕服務(wù)器的壓力,可以使用filter控制瀏覽器緩存這些文件,以提升服務(wù)器的性能。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter常見應(yīng)用(4) 使用Filter實(shí)現(xiàn)URL級別的權(quán)限認(rèn)證 情景:在實(shí)際開發(fā)中我們經(jīng)常把一些執(zhí)行敏感操作的servlet映射到一些特殊目錄中,并用filter把這些特

11、殊目錄保護(hù)起來,限制只能擁有相應(yīng)訪問權(quán)限的用戶才能訪問這些目錄下的資源。從而在我們系統(tǒng)中實(shí)現(xiàn)一種URL級別的權(quán)限功能。要求:為使Filter具有通用性,F(xiàn)ilter保護(hù)的資源和相應(yīng)的訪問權(quán)限通過filter參數(shù)的形式予以配置。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter常見應(yīng)用(5) 實(shí)現(xiàn)用戶自動登陸的過濾器 在用戶登陸成功后,發(fā)送一個名稱為user的cookie 編寫一個AutoLoginFilter,這個filter檢查用戶是否帶有名稱為user的cookie來,如果有,則調(diào)用dao查詢cookie的用戶名和是否和數(shù)據(jù)庫匹配,匹配則向sessi

12、on中存入user對象(即用戶登陸標(biāo)記),以實(shí)現(xiàn)程序完成自動登陸。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter的部署注冊Filter用于為過濾器指定一個名字,該元素的內(nèi)容不能為空。元素用于指定過濾器的完整的限定類名。元素用于為過濾器指定初始化參數(shù),它的子元素指定參數(shù)的名字,指定參數(shù)的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數(shù)。北京傳智播客教育 testFitlerorg.test.TestFiterword_file/WEB-INF/word.txt高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filte

13、r的部署映射Filter 元素用于設(shè)置一個 Filter 所負(fù)責(zé)攔截的資源。一個Filter攔截的資源可通過兩種方式來指定: Servlet 名稱和資源訪問的請求路徑 子元素用于設(shè)置filter的注冊名稱。該值必須是在元素中聲明過的過濾器的名字設(shè)置 filter 所攔截的請求路徑(過濾器關(guān)聯(lián)的URL 樣式)指定過濾器所攔截的Servlet名稱。指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST。用戶可以設(shè)置多個 子元素用來指定 Filter 對資源的多種調(diào)用方式進(jìn)行攔截。北京傳智播客教育 www.i

14、高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter的部署映射Filter 子元素可以設(shè)置的值及其意義:REQUEST:當(dāng)用戶直接訪問頁面時,Web容器將會調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問時,那么該過濾器就不會被調(diào)用。INCLUDE:如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調(diào)用。除此之外, 該過濾器不會被調(diào)用。FORWARD:如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾器將被調(diào)用,除此之外, 該過

15、濾器不會被調(diào)用。ERROR:如果目標(biāo)資源是通過聲明式異常處理機(jī)制調(diào)用時, 那么該過濾器將被調(diào)用。除此之外,過濾器不會被調(diào)用。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter的部署映射Filter示例北京傳智播客教育 testFilter/index.jspREQUESTFORWARDtestFilter/test.jsp高級軟件人才實(shí)作培訓(xùn)專家!Tip:Filter高級開發(fā) 由于開發(fā)人員在filter中可以得到代表用戶請求和響應(yīng)的request、response對象,因此在編程中可以使用Decorator(裝飾器)模式對req

16、uest、response對象進(jìn)行包裝,再把包裝對象傳給目標(biāo)資源,從而實(shí)現(xiàn)一些特殊需求。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip: Decorator設(shè)計模式 當(dāng)某個對象的方法不適應(yīng)業(yè)務(wù)需求時,通常有2種方式可以對方法進(jìn)行增強(qiáng):編寫子類,覆蓋需增強(qiáng)的方法使用Decorator設(shè)計模式對方法進(jìn)行增強(qiáng) 疑問:在實(shí)際應(yīng)用中遇到需增強(qiáng)對象的方法時,到底選用哪種方式呢?沒有具體的定式,不過有一種情況下,必須使用Decorator設(shè)計模式: 即被增強(qiáng)的對象,開發(fā)人員只能得到它的對象,無法得到它的class 文件。比如request、response對象,開發(fā)人員之所以在

17、servlet中能通過sun公司定義的HttpServletRequestresponse接口去操作這些對象, 是因?yàn)門omcat服務(wù)器廠商編寫了request、response接口的實(shí)現(xiàn)類。web服務(wù)器在調(diào)用servlet時,會用這些接口的實(shí)現(xiàn)類創(chuàng)建出對象, 然后傳遞給servlet程序。此種情況下,由于開發(fā)人員根本不知道服務(wù)器廠商編寫的request、response接口的實(shí)現(xiàn)類是哪個?在程序中只能拿到服務(wù)器廠商提供的對象,因此就只能采用Decorator設(shè)計模式對這些對象進(jìn)行增強(qiáng)。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip: Decorator設(shè)計模式

18、Decorator設(shè)計模式的實(shí)現(xiàn) 1.首先看需要被增強(qiáng)對象繼承了什么接口或父類,編寫一個類也去繼承這些接口或父類。2. 在類中定義一個變量,變量類型即需增強(qiáng)對象的類型。3. 在類中定義一個構(gòu)造函數(shù),接收需增強(qiáng)的對象。4. 覆蓋需增強(qiáng)的方法,編寫增強(qiáng)的代碼。 舉例:使用Decorator設(shè)計模式為BufferedReader類的readLine方法添加行號的功能。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:request對象的增強(qiáng) Servlet API 中提供了一個request對象的Decorator設(shè)計模式的默認(rèn)實(shí)現(xiàn)類HttpServletRequestW

19、rapper ,(HttpServletRequestWrapper 類實(shí)現(xiàn)了request 接口中的所有方法,但這些方法的內(nèi)部實(shí)現(xiàn)都是僅僅調(diào)用了一下所包裝的的 request 對象的對應(yīng)方法)以避免用戶在對request對象進(jìn)行增強(qiáng)時需要實(shí)現(xiàn)request接口中的所有方法。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:request對象的增強(qiáng)案例 使用Decorator模式包裝request對象,完全解決get、post請求方式下的亂碼問題。 使用Decorator模式包裝request對象,實(shí)現(xiàn)html標(biāo)簽轉(zhuǎn)義功能(Tomcat服務(wù)器中提供了轉(zhuǎn)義html標(biāo)簽

20、的工具類)。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip: response對象的增強(qiáng) ServletAPI 中提供了response對象的Decorator設(shè)計模式的默認(rèn)實(shí)現(xiàn)類HttpServletResponseWrapper ,(HttpServletResponseWrapper類實(shí)現(xiàn)了response接口中的所有方法,但這些方法的內(nèi)部實(shí)現(xiàn)都是僅僅調(diào)用了一下所包裝的的 response對象的對應(yīng)方法)以避免用戶在對response對象進(jìn)行增強(qiáng)時需要實(shí)現(xiàn)response接口中的所有方法。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!

21、Tip:response增強(qiáng)案例壓縮響應(yīng) 應(yīng)用HttpServletResponseWrapper對象,壓縮響應(yīng)正文內(nèi)容。思路: 通過filter向目標(biāo)頁面?zhèn)鬟f一個自定義的response對象。 在自定義的response對象中,重寫getOutputStream方法和getWriter方法,使目標(biāo)資源調(diào)用此方法輸出頁面內(nèi)容時,獲得的是我們自定義的ServletOutputStream對象。 在我們自定義的ServletOuputStream對象中,重寫write方法,使寫出的數(shù)據(jù)寫出到一個buffer中。當(dāng)頁面完成輸出后,在filter中就可得到頁面寫出的數(shù)據(jù),從而我們可以調(diào)用GzipOup

22、utStream對數(shù)據(jù)進(jìn)行壓縮后再寫出給瀏覽器,以此完成響應(yīng)正文件壓縮功能。北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:實(shí)用案例緩存數(shù)據(jù)到內(nèi)存 對于頁面中很少更新的數(shù)據(jù),例如商品分類,為避免每次都要從數(shù)據(jù)庫查詢分類數(shù)據(jù),因此可把分類數(shù)據(jù)緩存在內(nèi)存或文件中,以此來減輕數(shù)據(jù)庫壓力,提高系統(tǒng)響應(yīng)速度。高級軟件人才實(shí)作培訓(xùn)專家!Tip:動態(tài)在java里,每個對象都有一個類與之對應(yīng)?,F(xiàn)在要生成某一個對象的對象,這個對象也要通過一個類來生成,所以首先要編寫用于生成對象的類。如何編寫生成對象的類,兩個要素:誰如何生成誰?對象設(shè)計一個類變量,以及一個構(gòu)造函數(shù),記住類哪個對象。如何生成對象? 設(shè)計一個方法生成對象(在方法內(nèi)編寫代碼生成對象是此處編程的難點(diǎn))北京傳智播客教育 高級軟件人才實(shí)作培訓(xùn)專家!Tip:動態(tài) Java提供了一個Proxy類,調(diào)用它的

溫馨提示

  • 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

提交評論