Struts自定義攔截器_第1頁(yè)
Struts自定義攔截器_第2頁(yè)
Struts自定義攔截器_第3頁(yè)
Struts自定義攔截器_第4頁(yè)
Struts自定義攔截器_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Struts2Struts2自定義攔截器IBM Software Group本章內(nèi)容攔截器的概念配置攔截器使用攔截器StrutsStruts執(zhí)行流程簡(jiǎn)圖執(zhí)行流程簡(jiǎn)圖HttpServletRequestHttpServletResponse核心控制器核心控制器Intercepter1Intercepter2Intercepter3ActionResult為什么需要攔截器為什么需要攔截器 早期MVC框架將一些通用操作寫(xiě)死在核心控制器中,致使框架靈活性不足、可擴(kuò)展性降低 Struts 2將核心功能放到多個(gè)攔截器中實(shí)現(xiàn),攔截器可自由選擇和組合,增強(qiáng)了靈活性,有利于系統(tǒng)的解耦什么是攔截器什么是攔截器 S

2、truts 2大多數(shù)核心功能是通過(guò)攔截器實(shí)現(xiàn)的,每個(gè)攔截器完成某項(xiàng)功能 攔截器方法在Action執(zhí)行之前或者之后執(zhí)行攔截器棧 從結(jié)構(gòu)上看,攔截器棧相當(dāng)于多個(gè)攔截器的組合 在功能上看,攔截器棧也是攔截器 攔截器與過(guò)濾器原理很相似為為Action提供附加功能時(shí),無(wú)需修改提供附加功能時(shí),無(wú)需修改Action代碼,使用攔截器來(lái)提供代碼,使用攔截器來(lái)提供IBM Software Group攔截器的概念 攔截器(Interceptor)是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,類(lèi)似于Servlet中的過(guò)濾器。在執(zhí)行Action的業(yè)務(wù)邏輯處理方法execute()之前,Struts2會(huì)首先執(zhí)行在struts.xml

3、中引用的攔截器 攔截器是struts2的一個(gè)重要特性。Struts2框架的大多數(shù)核心功能都是通過(guò)攔截器來(lái)實(shí)現(xiàn)的,像避免表單重復(fù)提交、類(lèi)型轉(zhuǎn)換、對(duì)象組裝、驗(yàn)證、文件上傳等,都是在攔截器的幫助下實(shí)現(xiàn)的。攔截器之所以稱為“攔截器”,是因?yàn)樗梢栽贏ction執(zhí)行之前和執(zhí)行之后攔截調(diào)用。 Struts2將它的核心功能放到攔截器中實(shí)現(xiàn),而不是分散到Action中實(shí)現(xiàn),有利于系統(tǒng)的解耦,使得功能的實(shí)現(xiàn)類(lèi)似于個(gè)人電腦的組裝,變成了可插拔的,需要某個(gè)功能就“插入”一個(gè)攔截器,不需要某個(gè)功能就“拔出”一個(gè)攔截器。你可以任意組合攔截器來(lái)為Action提供附加的功能,而不需要修改Action的代碼。攔截器工作原理攔

4、截器工作原理 攔截器的執(zhí)行過(guò)程是一個(gè)遞歸的過(guò)程 三階段執(zhí)行周期:三階段執(zhí)行周期:1、做一些、做一些Action執(zhí)行前的預(yù)處理執(zhí)行前的預(yù)處理2、將控制交給后續(xù)攔截器或返回結(jié)果字符串、將控制交給后續(xù)攔截器或返回結(jié)果字符串3、做一些、做一些Action執(zhí)行后的處理執(zhí)行后的處理IBM Software Group攔截器的工作方式 攔截器圍繞著Action和Result的執(zhí)行而執(zhí)行,其工作方式如圖: 從圖中可以看到,在Action和Result執(zhí)行之前,為Action配置的攔截器將首先被執(zhí)行,在Action和Result執(zhí)行之后,攔截器將重新獲得控制權(quán),然后按照與先前調(diào)用相反的順序依次執(zhí)行。在整個(gè)執(zhí)行過(guò)

5、程中,任何一個(gè)攔截器都可以選擇直接返回,從而終止余下的攔截器、Action和Result的執(zhí)行。例如:當(dāng)一個(gè)未授權(quán)的用戶訪問(wèn)受保護(hù)的資源時(shí),執(zhí)行身份驗(yàn)證的攔截器可以直接返回。Struts 2Struts 2默認(rèn)攔截器棧默認(rèn)攔截器棧 struts-default.xml中定義一個(gè)defaultStack攔截器棧,并將其指定為默認(rèn)攔截器只要在定義包的過(guò)程中繼承struts-default包,那么defaultStack將是默認(rèn)的攔截器Struts 2Struts 2自帶攔截器自帶攔截器 Params攔截器 負(fù)責(zé)將請(qǐng)求參數(shù)設(shè)置為Action屬性servletConfig攔截器 將源于Servlet

6、API的各種對(duì)象注入到Action fileUpload攔截器 對(duì)文件上傳提供支持exception攔截器 捕獲異常,并且將異常映射到用戶自定義的錯(cuò)誤頁(yè)面validation攔截器 調(diào)用驗(yàn)證框架進(jìn)行數(shù)據(jù)驗(yàn)證 workflow攔截器 調(diào)用Action類(lèi)的validate(),執(zhí)行編碼驗(yàn)證IBM Software GroupStruts2內(nèi)置攔截器 Struts2內(nèi)建了大量的攔截器,這些攔截器以name-class對(duì)的形式配置在struts-default.xml文件中,其中name是攔截器的名字,就是以后使用該攔截器的唯一標(biāo)識(shí);class則指定了該攔截器的實(shí)現(xiàn)類(lèi),如果我們定義的package繼承

7、了Struts2的struts-default包,則可以自由使用下面定義的攔截器,否則必須自己定義這些攔截器。IBM Software GroupStruts2內(nèi)置攔截器大部分時(shí)候,開(kāi)發(fā)者無(wú)需手動(dòng)控制這些攔截器,因?yàn)榇蟛糠謺r(shí)候,開(kāi)發(fā)者無(wú)需手動(dòng)控制這些攔截器,因?yàn)閟truts-default.xml文件中已經(jīng)配置了這文件中已經(jīng)配置了這些攔截器,只要我們定義的包繼承了系統(tǒng)的些攔截器,只要我們定義的包繼承了系統(tǒng)的struts-default包,就可以直接使用這些攔截器。包,就可以直接使用這些攔截器。 IBM Software Group編寫(xiě)攔截器類(lèi)在struts2中要編寫(xiě)攔截器類(lèi),必須實(shí)現(xiàn)com.o

8、erceptor.Interceptor接口,該接口定義了如下的三個(gè)方法:void init(): 該方法在攔截器實(shí)例創(chuàng)建后、intercept()方法被調(diào)用之前調(diào)用,用于初始化攔截器所需要的資源,例如數(shù)據(jù)庫(kù)連接的初始化。該方法只執(zhí)行一次。void destroy(): 該方法在攔截器實(shí)例被銷(xiāo)毀之前調(diào)用,用于釋放在init()方法中分配的資源。該方法只執(zhí)行一次。String intercept(ActionInvocation invocation) throws Exception: 該方法在Action執(zhí)行之前被調(diào)用,攔截器為Action提供的附

9、加功能在該方法中實(shí)現(xiàn)。利用invocation參數(shù),可以獲取action執(zhí)行的狀態(tài)。在intercept()方法中,如果要繼續(xù)執(zhí)行后續(xù)的部分(包括余下的應(yīng)用于Action的攔截器、Action和Result),可以調(diào)用invocation.invoke()。如果要終止后續(xù)的執(zhí)行,可以直接返回一個(gè)結(jié)果碼,框架將根據(jù)這個(gè)結(jié)果碼來(lái)呈現(xiàn)對(duì)應(yīng)的結(jié)果視圖。攔截器工作原理攔截器工作原理攔截器示例public class MyTimerInterceptor extends AbstractInterceptorpublic String intercept(ActionInvocation invocati

10、on) throws Exception /預(yù)處理工作預(yù)處理工作long startTime = System.currentTimeMillis(); /執(zhí)行后續(xù)攔截器或執(zhí)行后續(xù)攔截器或ActionString result = invocation.invoke(); /后續(xù)處理工作后續(xù)處理工作 long execTime = System.currentTimeMillis() - startTime; System.out.println(The interval time is +execTime+ ms);/返回結(jié)果字符串返回結(jié)果字符串 return result;IBM Soft

11、ware GroupTimerInterceptor.javaimport com.opensymphony.xwork2.ActionInvocation;import erceptor.Interceptor;public class TimerInterceptor implements Interceptor public void destroy() public void init() public String intercept(ActionInvocation invocation) throws Exception lo

12、ng startTime = System.currentTimeMillis(); String result = invocation.invoke(); long executionTime = System.currentTimeMillis() - startTime; System.out.println(Action的執(zhí)行花費(fèi)的毫秒數(shù)是: + executionTime); return result; IBM Software GroupStruts.xmlindex.jspIBM Software Group說(shuō)明這是一個(gè)非常簡(jiǎn)單的攔截器,用于輸出Action執(zhí)行花費(fèi)的時(shí)間。在

13、invocation.invoke()調(diào)用的前后,你可以添加自己的邏輯代碼。Invocation.invoke()調(diào)用之前的代碼將在Action執(zhí)行之前執(zhí)行,invocation.ivoke()調(diào)用之后的代碼將在Action執(zhí)行之后執(zhí)行。為了簡(jiǎn)化攔截器的開(kāi)發(fā),struts2還提供了一個(gè)抽象類(lèi): erceptor.AbstractInterceptor 它實(shí)現(xiàn)了Interceptor接口,并給出了init()和destroy()方法的空實(shí)現(xiàn)。我們編寫(xiě)的攔截器類(lèi)也可以選擇繼承AbstractInterceptor類(lèi),如果不需要init()和de

14、stroy()方法,那么你只需要重寫(xiě)抽象的intercept()方法就可以了。Struts2還提供了一個(gè)特殊的攔截器抽象基類(lèi): erceptor.MethodFilterInterceptor 這個(gè)攔截器可以指定要攔截或排除的方法列表。通常情況下,攔截器將攔截Action的所有方法調(diào)用,但在某些應(yīng)用場(chǎng)景中,對(duì)某些方法的攔截將會(huì)出現(xiàn)一些問(wèn)題。例如:對(duì)表單字段進(jìn)行驗(yàn)證的攔截器,當(dāng)我們通過(guò)doDefault()方法輸出表單時(shí),該方法不應(yīng)該被攔截,因此此時(shí)表單字段都沒(méi)有數(shù)據(jù)。IBM Software Group說(shuō)明在struts2中,從Method

15、FilterInterceptor繼承的攔截器類(lèi)有: TokenInterceptor TokenSessionStoreInterceptor DefaultWorkflowInterceptor ExecuteAndWaitInterceptor ValidationInterceptor ParametersInterceptor PrepareInterceptorMethodFilterInterceptor通過(guò)指定included/excluded方法列表來(lái)選擇攔截器或排除的方法,可以設(shè)置的參數(shù)如下: excludeMethods-要排除的方法。 includeMethods-要攔

16、截的方法。例如:有如下的攔截器配置:input,back,cancelexecuteIBM Software Group說(shuō)明 當(dāng)執(zhí)行Action的input、back和cancel方法時(shí),驗(yàn)證攔截器將不執(zhí)行對(duì)輸入數(shù)據(jù)的驗(yàn)證。當(dāng)執(zhí)行Action的execute方法時(shí),驗(yàn)證攔截器將執(zhí)行對(duì)輸入數(shù)據(jù)的驗(yàn)證。 在設(shè)置攔截器或排除的方法時(shí),如果有多個(gè)方法,那么以逗號(hào)(,)分隔,如上所示。如果一個(gè)方法的名字同時(shí)出現(xiàn)在execludeMethods和includeMethods參數(shù)中,那么它會(huì)被當(dāng)作要攔截的方法。也就是說(shuō), includeMethods優(yōu)先于execludeMethods。 在編寫(xiě)攔截器類(lèi)的時(shí)

17、候要注意,攔截器必須是無(wú)狀態(tài)的,攔截器必須是無(wú)狀態(tài)的,換句話說(shuō),在攔截器類(lèi)中不應(yīng)該有實(shí)例變量換句話說(shuō),在攔截器類(lèi)中不應(yīng)該有實(shí)例變量。這是因?yàn)閟truts2對(duì)每一個(gè)Action的請(qǐng)求使用的是同一個(gè)攔截器實(shí)例來(lái)攔截調(diào)用,如果攔截器有狀態(tài),在多個(gè)線程(客戶端的每個(gè)請(qǐng)求將由服務(wù)器端的一個(gè)線程來(lái)服務(wù))同時(shí)訪問(wèn)一個(gè)攔截器實(shí)例的情況下,攔截器的狀態(tài)將不可預(yù)測(cè)。IBM Software Group攔截器棧 在很多時(shí)候,有些指定的攔截器需要被多個(gè)Action所使用,這個(gè)時(shí)候,如果我們?yōu)槊恳粋€(gè)Action都分別配置攔截器的話,不僅麻煩,而且不利后期的維護(hù),此時(shí)就需要用到攔截器棧。 所謂攔截器棧就是將一些攔截器組合

18、起來(lái)進(jìn)行統(tǒng)一管理。 攔截器棧的使用與攔截器的使用非常相似,唯一有區(qū)別的地方,就是攔截器棧的布署方式。IBM Software Group配置攔截器一在配置攔截器的時(shí)候可以為攔截器傳遞參數(shù),對(duì)于已經(jīng)配置好的攔截器,在引用時(shí)還可以覆蓋它的參數(shù)。例如,defaultStack攔截棧中的validation攔截器配置如下:input,back,cancel在Action配置中,我們想要覆蓋validation攔截器的excludeMethods參數(shù)的設(shè)置,可以配置如下:default index.jsp但這樣會(huì)有一個(gè)問(wèn)題,這是因?yàn)閐efaultStack攔截器棧包含了validation和workfl

19、ow攔截器,這兩個(gè)攔截器都可以有excludeMethods參數(shù),采用上述方式,框架將無(wú)法知道你是要為哪一個(gè)攔截器傳遞參數(shù)。IBM Software Group配置攔截器二 為此,struts2為我們提供了一種方式來(lái)覆蓋攔截器的參數(shù)設(shè)置,那就是在指定參數(shù)名時(shí),加上攔截器名前綴,例如:validation.excludeMethods.采用這種方式,我們?nèi)匀豢梢岳^續(xù)引用defaultStack攔截器棧,如下所示:default index.jsp 這樣一來(lái)就簡(jiǎn)潔多了。IBM Software Group安全驗(yàn)證攔截器一 login.jspIBM Software Group安全驗(yàn)證攔截器二 歡迎

20、你登錄后臺(tái)系統(tǒng) success.jspIBM Software Group安全驗(yàn)證攔截器三LoginAction.javaIBM Software Group安全驗(yàn)證攔截器三 LoginAction繼承自ActionSupport類(lèi),這是因?yàn)槲覀円没?lèi)的addActionError()方法來(lái)添加用戶登錄失敗的提示信息。LoginAction還實(shí)現(xiàn)了SessionAware接口,ServletConfig攔截器將會(huì)向LoginAction注入session Map對(duì)象。 當(dāng)用戶登錄成功后,我們將user對(duì)象保存到session中。在我們編寫(xiě)的執(zhí)行安全驗(yàn)證的攔截器中,可以根據(jù)session中是

21、否存在user對(duì)象,來(lái)判斷用戶是否登錄。IBM Software Group安全驗(yàn)證攔截器四 AuthenticationInterceptor攔截器負(fù)責(zé)判斷用戶是否已經(jīng)登錄,如果用戶已經(jīng)登錄,則繼續(xù)執(zhí)行余下的攔截器、Action和Result的調(diào)用;否則,返回Action.LOGIN結(jié)果代碼,將請(qǐng)求重定向到登錄頁(yè)面。 AuthenticationInterceptor類(lèi)的代碼如下:IBM Software Group安全驗(yàn)證攔截器五安全驗(yàn)證攔截器五 struts.xml配置配置Action和攔截器和攔截器IBM Software Group舉例說(shuō)明 如果一個(gè)結(jié)果在多個(gè)Action或者攔截器中

22、使用,那么就應(yīng)該將它定義為全局的結(jié)果,就像本例的login結(jié)果。 resource action的配置沒(méi)有指定類(lèi)名,因此默認(rèn)使用com.opensymphony.xwork2.ActionSupport類(lèi)。由于我們只是利用Action來(lái)轉(zhuǎn)發(fā)請(qǐng)求,所以簡(jiǎn)單地使用ActionSupport類(lèi)就可以了。 注意:只對(duì)需要保護(hù)的Action設(shè)置引用securityStackk攔截器棧;對(duì)于LoginAction,本身就是用來(lái)登錄的, 因此不要對(duì)它引用securityStack攔截器棧。 測(cè)試與發(fā)布: http:/localhost:8080/項(xiàng)目名/resource.action 在登錄后,再次訪問(wèn)/r

23、esource.action??纯唇Y(jié)果。IBM Software Group攔截器的高級(jí)應(yīng)用 如何自定義攔截器 指定攔截器作用于某個(gè)方法 多個(gè)攔截器的執(zhí)行順序 攔截器在解決重復(fù)提交中的作用IBM Software Group如何自定義攔截器 實(shí)現(xiàn)Interceptor接口 繼承AbstractInterceptor類(lèi),此類(lèi)實(shí)現(xiàn)了Interceptor接口 繼承MethodFilterInterceptor,可實(shí)現(xiàn)方法過(guò)濾攔截IBM Software Groupstruts.xmlIBM Software Group指定攔截器作用于某個(gè)方法 需要攔截器作用的方法,使用excludeMethods

24、方法 不需要攔截器作用的方法,使用includeMethods方法IBM Software Groupstruts.xml測(cè)試:http:/localhost:8888/testInterceptor_self/test1.actionhttp:/localhost:8888/testInterceptor_self/test2.actionIBM Software Group多個(gè)攔截器的執(zhí)行順序IBM Software Group三個(gè)攔截器類(lèi)三個(gè)攔截器類(lèi)IBM Software Groupstruts.xmlIBM Software Group文字過(guò)濾攔截器 實(shí)例說(shuō)明 例如:網(wǎng)上有些論壇要求

25、會(huì)員發(fā)帖的內(nèi)容不能帶有臟字,如果會(huì)員發(fā)帖時(shí)使用不文明語(yǔ)言,通常情況下,系統(tǒng)會(huì)以“*”替代這些臟字。在struts2中可以使用攔截器來(lái)實(shí)現(xiàn)這個(gè)功能。IBM Software GroupAction類(lèi)IBM Software Group攔截器類(lèi)IBM Software Groupstruts.xml配置文件IBM Software Group成功頁(yè)面使用使用TokenInterceptor實(shí)現(xiàn)防止表單重復(fù)提交實(shí)現(xiàn)防止表單重復(fù)提交由于某些原因,用戶在進(jìn)行類(lèi)似表單提交的操作后,以為表單未被提交,會(huì)進(jìn)行多次的重復(fù)提交。為了避免用戶多次提交給服務(wù)器帶來(lái)負(fù)荷。我們會(huì)對(duì)表單提交這樣的操作進(jìn)行一些處理,以告訴用戶不要重復(fù)提交。第一步:使用標(biāo)簽:登錄頁(yè)面中的關(guān)鍵技術(shù)就是使用了標(biāo)簽庫(kù)中的標(biāo)簽,它的作用就是在用戶訪問(wèn)此頁(yè)面時(shí)會(huì)生成一個(gè)sessionId,在提交時(shí)會(huì)服務(wù)器會(huì)據(jù)此驗(yàn)證表單是否已提交,提交到的Action便能配置TokenInterceptor攔截器驗(yàn)證表單是否重復(fù)提交。第二步:配置XML文件 /success.jsp/subError.jsp此Action下,我們配置了token攔截器,另注意到在此Action下我們還配置了一個(gè)“invalid.token”result,提交時(shí)服務(wù)器如果根據(jù)token標(biāo)簽產(chǎn)生的sessionId判斷出表單已提交,它則返回invalid.token指

溫馨提示

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

評(píng)論

0/150

提交評(píng)論