黃玲
?
基于AOP思想的過濾器技術(shù)及其應(yīng)用
黃玲
重慶工程學(xué)院,重慶 400056
AOP為Aspect Oriented Programming的縮寫,意為面向切面編程。利用AOP可以對業(yè)務(wù)邏輯的各個部分進(jìn)行隔離,從而使得業(yè)務(wù)各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。過濾器就應(yīng)用了這種思想在客戶端提交數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯出來之前對提交的數(shù)據(jù)進(jìn)行預(yù)處理。過濾器在生成系統(tǒng)日志,權(quán)限管理等方面有非常廣泛的應(yīng)用。
AOP;面向切面編程;攔截器
過濾器提供過濾作用,所謂過濾也就是說按照一定的規(guī)則放走一部分東西,而留下另一部分東西。形象地說,就像漁網(wǎng)。漁網(wǎng)有洞,比網(wǎng)洞大的魚被漁網(wǎng)留在網(wǎng)里,而比網(wǎng)洞小的魚則漏出漁網(wǎng),從而起到了攔住大魚,放掉小魚的目的。
Java中的過濾器不能處理用戶請求,和對客戶端生成響應(yīng),它只提供過濾作用。主要用于對HttpServletRequest進(jìn)行預(yù)處理,攔截Request之后,提取用戶提交的數(shù)據(jù);也可以對HttpServletResponse進(jìn)行后處理,是個典型的處理鏈。一個web.xml文件中可以配置多過濾器,Web服務(wù)器按照它們在web.xml文件中的配置順序來加載這些過濾器。
Servlet過濾器中結(jié)合了許多元素,從而使得過濾器成為獨(dú)特、強(qiáng)大和模塊化的Web組件。也就是說,Servlet過濾器是:
聲明式的:通過Web部署中的XML標(biāo)簽來聲明。這樣允許添加和刪除過濾器,而無需改動任何應(yīng)用程序代碼。
動態(tài)的:過濾器在運(yùn)行時由Servlet容器調(diào)用來攔截和處理請求和響應(yīng)。
靈活的:它可用于對來自客戶機(jī)的直接調(diào)用執(zhí)行預(yù)處理、后期處理以及處理在防火墻之后的Web組件之間調(diào)度的請求。最后,可以將過濾器鏈接起來以提供必需的功能。
模塊化的:通過把應(yīng)用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求或響應(yīng)鏈中添加或刪除的模塊化單元[1]。
可移植的:與Java平臺的其他許多方面一樣,Servlet過濾器是跨平臺和跨容器可移植的,從而進(jìn)一步支持了Servler過濾器的模塊化和可重用本質(zhì)。
可重用的:歸功于過濾器實現(xiàn)類的模塊化設(shè)計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應(yīng)用程序使用。
透明的:過濾器可以根據(jù)需要添加或刪除,而不會破壞Servlet或JSP頁面。
Servlet可以用來處理用戶請求。但是在用戶具體的請求的業(yè)務(wù)功能的同時,系統(tǒng)有一些特殊的需求。比如確認(rèn)該用戶是否有權(quán)限提交該請求,這就是權(quán)限管理。對于有的系統(tǒng),所有的用戶請求都必須驗證用戶是否有權(quán)限。這種驗證往往是共通,如果在每次請求中進(jìn)行處理,不僅會產(chǎn)生大量的重復(fù)代碼,工作量大,效率低,而且質(zhì)量也無法保證。這時我們就可以用到過濾器了。過濾器攔截用戶請求,判斷用戶是否有權(quán)限來訪問這個資源。有則讓他去訪問,沒有就讓他轉(zhuǎn)到另外一個頁面。這樣通過過濾器就實現(xiàn)了授權(quán)管理。當(dāng)然過濾器不僅可以完成用戶驗證與權(quán)限管理,還有其他許多的用途。比如:驗證用戶提交的請求中有沒有不合法的文字、字符;統(tǒng)計Web應(yīng)用的訪問量和訪問的命中率,報告;實現(xiàn)Web應(yīng)用的日志處理功能;實現(xiàn)數(shù)據(jù)壓縮功能;對傳輸?shù)臄?shù)據(jù)進(jìn)行加密;實現(xiàn)XML文件的XSLT轉(zhuǎn)換等等。
一個用戶請求,即一個Servlet可以有多個過濾器,以實現(xiàn)多個過濾邏輯[2]。
所有的Servlet過濾器都必須實現(xiàn)javax.servlet. Filter接口,并實現(xiàn)該接口中的三個方法:init(Filter Config filter Config)。
Servlet過濾器的初始化方法,Servlet容器創(chuàng)建Servlet過濾器實例后將調(diào)用該方法。該方法將讀取web.xml文件中Servlet過濾器的初始化參數(shù)。doFilter(ServletRequest request,ServletResponse response,F(xiàn)ilterChain chain).
該方法完成實際的過濾操作,當(dāng)客戶端請求方法與過濾器設(shè)置匹配的URL時,Servlet容器將先調(diào)用過濾器的doFilter方法,F(xiàn)ilterChain用戶訪問后續(xù)過濾器。
destroy()
在Web容器卸載過濾器前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次,可以釋放過濾器使用的資源。
圖1 過濾的執(zhí)行流程
過濾器的執(zhí)行流程如圖所示,過濾器的處理過程是一個鏈?zhǔn)降倪^程(FilterChain),即多個過濾器組成一個鏈,依次處理,先處理第一個過濾器的doFilter()方法中的chain.doFilter()方法之前的內(nèi)容,即圖中左邊大矩形中的“Code1”。之后通過chain.doFilter()方法將控制權(quán)交給下一個過濾器,執(zhí)行下一個過濾器的doFilter()方法中的chain.doFilter()方法之前的內(nèi)容,即圖中中間大矩形中的“Code1”。以此類推,最后交給Servlet,執(zhí)行Servlet的service()方法。service()方法執(zhí)行完以后,控制權(quán)再交回給最后一個過濾器,執(zhí)行過濾器的doFilter()方法中的chain.doFilter()方法之后的內(nèi)容,即圖中右邊大矩形中的“Code2”,之后再回到倒數(shù)第二個過濾器,執(zhí)行過濾器的doFilter()方法中的chain.doFilter()方法之后的內(nèi)容。以此類推,最后返回客戶端,在畫面上顯示請求結(jié)果[3]。其中鏈?zhǔn)竭^濾過程中也可以直接給出響應(yīng),即返回客戶端,而不是向后傳遞。
[1]陳敏,唐溢鍵,周新志.用Servlet過濾器簡化中文的輸入和輸出[J].成都信息工程學(xué)院學(xué)報,2005,20(2):129-133.
[2]謝志華.深入Java Servlet網(wǎng)絡(luò)編程[M].西安:西安電子科技大學(xué)出版社,2004.
[3]柳永坡,劉雪梅,趙長海.JSP應(yīng)用開發(fā)技術(shù)[M].北京:人民郵電出版社,2005.
黃玲(1980—),女,漢族,上海交通大學(xué)計算機(jī)及工商管理雙學(xué)士學(xué)位,具備多年的對日開發(fā)經(jīng)驗,具備較強(qiáng)的日語、英語能力,2006年9月赴日從事軟件開發(fā)工作,從事J2EE應(yīng)用項目、嵌入式系統(tǒng),手機(jī)軟件開發(fā)等。
TP311.52
A
1009-6434(2016)05-0049-01