最近發(fā)現(xiàn)很多朋友連攔截器都不知道,于是想寫個(gè)BLOG總結(jié)一下。
java攔截器的基本原理其實(shí)非常簡(jiǎn)單,說(shuō)白了就是動(dòng)態(tài)代理類。
下面來(lái)看一個(gè)簡(jiǎn)單的例子
首先,我建立一個(gè)攔截器的類InterceptorClass,這里的before()和after()方法是以后攔截器會(huì)執(zhí)行的方法
CODE清單一:








我們模擬一個(gè)業(yè)務(wù)組件接口BusinessInterface,和一個(gè)業(yè)務(wù)組件實(shí)現(xiàn)類BusinessClass
CODE清單二:



CODE清單三:





然后,創(chuàng)建一個(gè)動(dòng)態(tài)代理類DynamicProxyHandler,這個(gè)類是集成InvocationHandler接口的,動(dòng)態(tài)類的原理實(shí)際上是使得當(dāng)你執(zhí)行一個(gè)動(dòng)態(tài)方
法的時(shí)候,他可以把這個(gè)動(dòng)態(tài)方法dispatch到這個(gè)動(dòng)態(tài)類上來(lái)。這樣,你就可以在這個(gè)方法的前后嵌入自己的一些方法。
CODE清單四:
//包含了業(yè)務(wù)對(duì)象綁定動(dòng)態(tài)代理類的處理,并實(shí)現(xiàn)了InvocationHandler接口的invoke方法















// 代理要調(diào)用的方法,并在方法調(diào)用前后調(diào)用連接器的方法















OK,我們來(lái)寫個(gè)類測(cè)試一下
CODE清單五:










來(lái)看看結(jié)果:
近期struts2很流行,而且攔截器是struts2里面一個(gè)比較好的功能,下面舉個(gè)例子說(shuō)明一下攔截器在struts2中的用法。
struts2對(duì)攔截器實(shí)現(xiàn)做了一個(gè)封裝,使得我們?cè)趯?shí)現(xiàn)的時(shí)候比較簡(jiǎn)單。
首先我們要建一個(gè)攔截器類
CODE清單六:

















這個(gè)類是必須要繼承struts2包中提供的AbstractInterceptor類,這個(gè)類有一個(gè)抽象方法intercept,這個(gè)方法是必須要實(shí)現(xiàn)的。
那么經(jīng)理在這個(gè)攔截器里面寫了一個(gè)簡(jiǎn)單的實(shí)現(xiàn),對(duì)url用戶合法性做了一個(gè)限制。
接下來(lái)比較關(guān)鍵的是過濾器在struts2中的配置,先看看代碼
CODE清單七:
























在interceptors節(jié)點(diǎn)里,我們可以定義多個(gè)攔截器,這里的名為authority的只是其中的一個(gè)。struts2的攔截器棧我是先執(zhí)行struts2默認(rèn)的攔
截器defaultStack,然后再執(zhí)行我的。然后只需要用default-interceptor-ref標(biāo)簽設(shè)置好這個(gè)system包中的默認(rèn)攔截器為這個(gè)攔截器就OK了。
struts2中引入了package這個(gè)概念,我覺得十分實(shí)用,當(dāng)然這對(duì)struts2攔截器也是個(gè)實(shí)惠,我們可以根據(jù)不同的action來(lái)分包和不同的攔截器
ok,來(lái)運(yùn)行測(cè)試一下。
結(jié)果..