Struts2的攔截器是個好利器!尤其是自定義攔截器,以下是我個人整理的很詳細的整個流程,希望給大家帶來幫助,有更好見解的希望可以提出寶貴的意見。
原理:
a) Web瀏覽器發送請求
b) 首先通過一組Struts2默認的攔截棧 dispatcher (或者 ServletFilter)
c) 自定義interceptor(攔截器)
d) Action
e) Result
struts.xml配置如下:
<package name=”default” namespace=”/” extends=”struts-default”> <--所有的配置都應放在package中--> <interceptors> <-- 所有的攔截器自定義的配置和引用、已經攔截棧的定義都應放在interceptors中--> <-- 自定義攔截器 name指定自定義攔截器的引用名稱 class 指定該攔截器的實現類(完整路徑) --> <interceptor name="sessionCheck" class="com.cqrcb.perinvite.interceptor.AuthorityInterceptor" /> <-- 自定義攔截棧 name 指定自定義攔截棧的引用名稱 --> <interceptor-stack name="sessionCheckStack"> <-- name為所要引用的攔截器的引用名稱 剛才定義了一個name為 sessionCheck的攔截器,則引用就為 sessionCheck--> <-- 每一個自定義的攔截棧都應該必須配上defaultStack攔截棧,該攔截棧是Struts2默認的攔截棧,里面封裝了一組攔截器--> <interceptor-ref name="defaultStack" /> <interceptor-ref name="sessionCheck" /> </interceptor-stack> </interceptors> < -- 配置全局默認的Action -- > <default-action-ref name="IndexAction" /> < -- 配置全局默認的result-- > <global-results> <-- 配置token的invalid.token的返回視圖,即當頁面重復提交,頁面將自動轉到/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, 轉發跳轉到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已經包含了自定義攔截器和Struts2的默認攔截棧,所以直接引用sessioncheckstack即可-- > <interceptor-ref name=" sessionCheckStack "/> <-- 如果直接引用自定義的攔截器,即沒有包含默認的攔截棧,則需要引用Struts2的默認攔截棧,以下-- > <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")//攔截棧的引用,藍色自定義攔截器的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;/** * 權限攔截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,則進行執行,即不做攔截 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的自定義攔截器有很多方式,本文的內容是前置攔截,即獲取到action的請求所做的攔截。struts2還有后置攔截和中間攔截,這兩種也是很常用的,有時間整理完之后我會發到博客,大家一起探討。
新聞熱點
疑難解答