2025-02-10

1.    什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。

2.    Struts2默認攔截器棧:

 

攔截器

名字

說明

Alias Interceptor

alias

在不同請求之間將請求參數在不同名字件轉換,請求內容不變

Chaining Interceptor

chain

讓前一個Action的屬性可以被後一個Action訪問,現在和chain類型的result(<result type=”chain”>)結合使用。

Checkbox Interceptor

checkbox

添加瞭checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value來是指cookies

Conversion Error Interceptor

conversionError

將錯誤從ActionContext中添加到Action的屬性字段中。

Create Session Interceptor

createSession

自動的創建HttpSession,用來為需要使用到HttpSession的攔截器服務。

Debugging Interceptor

debugging

提供不同的調試用的頁面來展現內部的數據狀況。

Execute and Wait Interceptor

execAndWait

在後臺執行Action,同時將用戶帶到一個中間的等待頁面。

Exception Interceptor

exception

將異常定位到一個畫面

File Upload Interceptor

fileUpload

提供文件上傳功能

I18n Interceptor

i18n

記錄用戶選擇的locale

Logger Interceptor

logger

輸出Action的名字

Message Store Interceptor

store

存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。

Model Driven Interceptor

model-driven

如果一個類實現瞭ModelDriven,將getModel得到的結果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一個Action實現瞭ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用Action的setModel方法將其放入Action內部。

Parameters Interceptor

params

將請求中的參數設置到Action中去。

Prepare Interceptor

prepare

如果Acton實現瞭Preparable,則該攔截器調用Action類的prepare方法。

Scope Interceptor

scope

將Action狀態存入session和application的簡單方法。

Servlet Config Interceptor

servletConfig

提供訪問HttpServletRequest和HttpServletResponse的方法,以Map的方式訪問。

Static Parameters Interceptor

staticParams

從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。

Roles Interceptor

roles

確定用戶是否具有JAAS指定的Role,否則不予執行。

Timer Interceptor

timer

輸出Action執行的時間

Token Interceptor

token

通過Token來避免雙擊

Token Session Interceptor

tokenSession

和Token Interceptor一樣,不過雙擊的時候把請求的數據存儲在Session中

Validation Interceptor

validation

使用action-validation.xml文件中定義的內容校驗提交的數據。

Workflow Interceptor

workflow

調用Action的validate方法,一旦有錯誤返回,重新定位到INPUT畫面

Parameter Filter Interceptor

N/A

從參數列表中刪除不必要的參數

Profiling Interceptor

profiling

通過參數激活profile

 

3.    自定義攔截器的實現:
雖然,Struts 2為我們提供如此豐富的攔截器實現,但是在某種情況下並不能滿足我們的需求,比如:訪問控制的時候,在用戶每次訪問某個action時,我們要去校驗用戶是否已經登入,如果沒有登入我們將在action執行之前就被攔截;此時我們就需要自定義攔截器;

3.1.實現攔截器類

所有的Struts 2的攔截器都直接或間接實現接口com.opensymphony.xwork2.interceptor.Interceptor。該接口提供瞭三

個方法:

1)      void init(); 在該攔截器被初始化之後,在該攔截器執行攔截之前,系統回調該方法。對於每個攔截器而言,此方法隻執行一次。

2)      void destroy();該方法跟init()方法對應。在攔截器實例被銷毀之前,系統將回調該方法。

3)      String intercept(ActionInvocation invocation) throws Exception; 該方法是用戶需要實現的攔截動作。該方法會返回一個字符串作為邏輯視圖。

 


除此之外,繼承類com.opensymphony.xwork2.interceptor.AbstractInterceptor是更簡單的一種實現攔截器類的方式,

因為此類提供瞭init()和destroy()方法的空實現,這樣我們隻需要實現intercept方法。

 


3.2.註冊自定義攔截器

自定義攔截器類實現瞭,現在就要在struts裡註冊這個攔截器;

3.2.1.   註冊攔截器,在struts.xml中的package中註冊攔截器

<interceptors>

        <!– name: 攔截器的名稱,class:自定義攔截器的類 –>

        <interceptor name="攔截器名稱" class="自定義攔截器的class路徑" />

      </ interceptors >
3.2.1.   使用攔截器,在需要使用自定義攔截器的action中定義如下代碼
< action >
        <interceptor-ref name="攔截器名稱"/>

      </action>

註意:

        因為struts2的很多功能都是根據攔截器實現的;如果此處隻使用自定義的攔截器時,將失去struts2的很多核心功能;所以需要定義一個攔截器棧(由一個或多個攔截器組成)

3.2.2.   攔截器棧

<interceptor-stack name="攔截器棧的名稱">

        <!– 需要註意的是:系統默認的攔截器棧應要放在前面,在加入自定義攔截器; –>

           <interceptor-ref name="defaultState" />

           <interceptor-ref name="自定義攔截器的名稱" />

        </ interceptor-stack >

3.2.3.   在action中使用棧
< action >
        <interceptor-ref name="棧名稱或攔截器名稱"/>

。。。。。。


      </action>

3.2.3.   如果此時需要所有的action都使用自定義攔截器時,此時就定義一個默認的攔截器

<default-interceptor-ref name="permissionStack"/>

註意:如果在某個action中又使用瞭另一個攔截器,此時默認的攔截器將失效,為瞭確保能夠使用默認的攔截器,又需要添加其他攔截器時,可以在action中加上其他攔截器

3.2.3.   配置文件

<!DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

       "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <package name="my" extends="struts-default">

        <interceptors>

            <!– 定義權限控制攔截器 –>

            <interceptor name="permissions"

                class="com.perm.interceptor.PermissionsInterceptor" />

            <!– 定義一個包含權限控制的攔截器棧 –>

            <interceptor-stack name="c">

                <interceptor-ref name="defaultStack" />

                <interceptor-ref name="permissions" />

            </interceptor-stack>

        </interceptors>

       

        <!– 定義默認攔截器 –>

        <default-interceptor-ref name="permissionsStack" />

 

        <!– 定義全局處理結果 –>

        <global-results>

            <!– 邏輯名為error的結果,映射到/message.jsp頁面 –>

            <result name="error">/message.jsp</result>

        </global-results>

 

        <action name="listall"

           class="com.perm.action.UserAction"

            method="listAllUser">

           <result name="success">/listall.jsp</result>

       </action>

    </package>

</struts>

 

 作者“wuchongchang的博客”
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *