什么是攔截器?
interceptor攔截器類似于過濾器,是可以再Action執(zhí)行前后執(zhí)行的代碼壹堰。是我們做web開發(fā)時(shí)經(jīng)常用的技術(shù)。比如:權(quán)限控制骡湖、日志控制等贱纠。我們可以講多個(gè)interceptor連在一起組成interceptor棧。
Struts2攔截器响蕴,每個(gè)連接器類只有一個(gè)實(shí)例谆焊,即采用單例模式,所有引用這個(gè)攔截器的Action都共享這一攔截器類的實(shí)例浦夷,因此辖试,在攔截器中如果使用類變量,要注意同步問題劈狐。簡(jiǎn)單的說罐孝,我們自定義了一個(gè)攔截器,這個(gè)攔截器可以被多個(gè)Action共同使用肥缔。
攔截器執(zhí)行過程:
首先參考這張圖肾档,這是Struts2的執(zhí)行流程圖
上圖我們可以看出,當(dāng)web容器接受到一個(gè)請(qǐng)求時(shí),將請(qǐng)求傳遞給一個(gè)標(biāo)準(zhǔn)的過濾器鏈怒见,其中包括ActionContentCleanUp過濾器及其他過濾器俗慈,接下來,需要調(diào)用FilterDispatcher遣耍,調(diào)用ActionMapper確定請(qǐng)求調(diào)用那個(gè)Action闺阱,ActionMapper返回一個(gè)收集了Action詳細(xì)信息的ActionMapping對(duì)象。
接下來FilterDispatcher將控制權(quán)交給ActionProxy,ActionProxy調(diào)用配置管理器(Configuration)從配置文件中讀取配置信息,然后創(chuàng)建ActionInvocation對(duì)象舵变。ActionInvocation在調(diào)用Action之前會(huì)一次調(diào)用所有配置的攔截器酣溃。
一旦Action執(zhí)行返回結(jié)果字符串,ActionInvocation負(fù)責(zé)查找結(jié)果字符串對(duì)應(yīng)的Result纪隙,然后執(zhí)行這個(gè)Result赊豌。
核心接口和類:
????ActionMapper:提供了請(qǐng)求和Action調(diào)用請(qǐng)求之間的映射,根據(jù)請(qǐng)求的URL來找是否存在對(duì)應(yīng)的Action調(diào)用請(qǐng)求绵咱。如果沒有找到則返回null,成功返回一個(gè)描述Action的ActionMapping對(duì)象碘饼。
????ActionMapping:保存了調(diào)用Action的映射信息蛮艰,通過此信息可以找到你調(diào)用的Action屬于那個(gè)類寿酌。
????ActionProxy:在XWork和真正的Action之間充當(dāng)代理领斥。
????ActionInvocation:Action的調(diào)度者盗舰,它可以執(zhí)行攔截器、Action和Result烂瘫。
????Interceptor:攔截器扎即,在執(zhí)行Action之前和之后執(zhí)行那些代碼醒第。
注意:
????1.上圖Interceptor1花沉,Interceptor2柳爽,Interceptor3指的是你攔截器的名字和順序(還有Struts2框架提供的),并不是名字就叫Interceptor1碱屁。
????2.我們主要是圍繞著Interceptor(攔截器)泻拦、Action和Result做開發(fā),其它的接口或類忽媒,我感覺只做了解即可。
攔截器棧:
????聽起來感覺很牛逼腋粥,其實(shí)說白了晦雨,就是由多個(gè)攔截器組成。在Struts2中隘冲,我們可以有很多攔截器闹瞧。你可以根據(jù)你想要的功能,組合出不同的攔截器展辞。你可以在Struts2的核心包中找到有個(gè)叫struts-default.xml中查看Struts2框架中自帶的攔截器(有些攔截器是必須的奥邮,如果沒有會(huì)無法執(zhí)行某些操作)。
攔截器和過濾器的區(qū)別:
????1.攔截器和過濾器概念非常類似。
????2.過濾器屬于web容器洽腺,可以過濾一切請(qǐng)求(action脚粟、servlet、jsp蘸朋、html等)核无。
????3.攔截器屬于srtuts框架,只能攔截action請(qǐng)求(無法攔截jsp請(qǐng)求)藕坯。
????4.過濾器采用函數(shù)回調(diào)實(shí)現(xiàn)团南。攔截器使用動(dòng)態(tài)代理實(shí)現(xiàn)。