個人總結的Struts2攔截器使用和攔截棧的配置,基於注解的方式


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")
//攔截棧的引用,藍色字體即攔截棧的引用名稱
@InterceptorRefs(@InterceptorRef("sessionCheckStack"))



 

自定義攔截器的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還有后置攔截和中間攔截,這兩種也是很常用的,有時間整理完之后我會發到博客,大家一起探討。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM