Struts2的攔截器是個好利器!尤其是自定義攔截器,以下是我個人整理的很詳細(xì)的整個流程,希望給大家?guī)韼椭懈靡娊獾南M梢蕴岢鰧氋F的意見。
原理:
a) Web瀏覽器發(fā)送請求
b) 首先通過一組Struts2默認(rèn)的攔截棧 dispatcher (或者 ServletFilter)
c) 自定義interceptor(攔截器)
d) Action
e) Result
struts.xml配置如下:
<package name=”default” namespace=”/” extends=”struts-default”> <--所有的配置都應(yīng)放在package中--> <interceptors> <-- 所有的攔截器自定義的配置和引用、已經(jīng)攔截棧的定義都應(yīng)放在interceptors中--> <-- 自定義攔截器 name指定自定義攔截器的引用名稱 class 指定該攔截器的實現(xiàn)類(完整路徑) --> <interceptor name="sessionCheck" class="com.cqrcb.perinvite.interceptor.AuthorityInterceptor" /> <-- 自定義攔截棧 name 指定自定義攔截棧的引用名稱 --> <interceptor-stack name="sessionCheckStack"> <-- name為所要引用的攔截器的引用名稱 剛才定義了一個name為 sessionCheck的攔截器,則引用就為 sessionCheck--> <-- 每一個自定義的攔截棧都應(yīng)該必須配上defaultStack攔截棧,該攔截棧是Struts2默認(rèn)的攔截棧,里面封裝了一組攔截器--> <interceptor-ref name="defaultStack" /> <interceptor-ref name="sessionCheck" /> </interceptor-stack> </interceptors> < -- 配置全局默認(rèn)的Action -- > <default-action-ref name="IndexAction" /> < -- 配置全局默認(rèn)的result-- > <global-results> <-- 配置token的invalid.token的返回視圖,即當(dāng)頁面重復(fù)提交,頁面將自動轉(zhuǎn)到/error.jsp頁面并提示 -- > <result name="invalid.token">/error.jsp</result> <result name="error">/error.jsp</result> <-- 配置name為backhome的resule,重定向為IndexAction-- > <result name="backhome" type="redirectAction">IndexAction</result> <-- 配置name為testChain的resule, 轉(zhuǎn)發(fā)跳轉(zhuǎn)到testAction -- > <result name="testChain" type="chain ">testAction</result> </global-results> < --使用攔截器有兩種方式,annoction(注解)和xml配置,以下是XML配置--> <action name="testAction" class="com.cqrcb.perinvite.resume.action.testAction"> <-- 在此Action訪問之前引入sessionCheckStack攔截棧 name為攔截棧定義的引用名稱-- > <-- 此sessionCheckStack已經(jīng)包含了自定義攔截器和Struts2的默認(rèn)攔截棧,所以直接引用sessioncheckstack即可-- > <interceptor-ref name=" sessionCheckStack "/> <-- 如果直接引用自定義的攔截器,即沒有包含默認(rèn)的攔截棧,則需要引用Struts2的默認(rèn)攔截棧,以下-- > <interceptor-ref name=”testInter”/> <interceptor-ref name=”defaultStack”/> <-- 一個Action中只要有一個defaultStack即可,如果引用的攔截棧有了defaultStack,則就不必再引用defaultStack,否則,引之-- ><result name="success"> Success.jsp </result> <result name="input"> input.jsp </result> </action></package>
annoction注解中使用攔截器和攔截棧
//直接在類名稱的上端寫入即可,value中指定要引入的攔截器的名稱即可@InterceptorRef(value="token")//攔截棧的引用,藍(lán)色自定義攔截器的javabean
package com.cqrcb.perinvite.interceptor; import com.cqrcb.perinvite.logon.action.IndexAction;import com.netbank.pub.vo.core.PbClientInfoVO;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/** * 權(quán)限攔截Action * @author wangyupeng * *///繼承 AbstractInterceptor 類public class AuthorityInterceptor extends AbstractInterceptor{ PRivate static final long serialVersionUID = 4546936882066035745L; //重寫intercept方法 public String intercept(ActionInvocation invocation) throws Exception { //獲取Action的攔截路徑 ActionContext ax = invocation.getInvocationContext(); //獲取Action對象 Object action = invocation.getAction(); // 對IndexAction不做該項攔截 action instanceof IndexAction 解釋為如果Action的實例為IndexAction if (action instanceof IndexAction) { //如果是IndexAction,則進行執(zhí)行,即不做攔截 return invocation.invoke(); } //獲取session中key為pinfo的對象 PbClientInfoVO pinfo =(PbClientInfoVO) ax.getSession().get("pinfo"); if(pinfo==null){ //如果pinfo為null,則返回全局result為backhone的視圖 return "backhome"; } //如果都不為false,則不做攔截 return invocation.invoke(); } }struts2的自定義攔截器有很多方式,本文的內(nèi)容是前置攔截,即獲取到action的請求所做的攔截。struts2還有后置攔截和中間攔截,這兩種也是很常用的,有時間整理完之后我會發(fā)到博客,大家一起探討。
新聞熱點
疑難解答