攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問以前,進行攔截而後在以前或以後加入某些操做。攔截是AOP的一種實現策略。html
2. Struts2默認攔截器棧:
攔截器apache |
名字cookie |
說明session |
Alias Interceptorapp |
aliasjsp |
在不一樣請求之間將請求參數在不一樣名字件轉換,請求內容不變spa |
Chaining Interceptordebug |
chain調試 |
讓前一個Action的屬性能夠被後一個Action訪問,如今和chain類型的result(<result type=」chain」>)結合使用。xml |
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的攔截器都直接或間接實現接口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 ><interceptor-ref name="攔截器名稱"/>
</action>
注意:
由於struts2的不少功能都是根據攔截器實現的;若是此處只使用自定義的攔截器時,將失去struts2的不少核心功能;因此須要定義一個攔截器棧(由一個或多個攔截器組成)
3.2.2. 攔截器棧
<interceptor-stack name="攔截器棧的名稱">
<!-- 須要注意的是:系統默認的攔截器棧應要放在前面,在加入自定義攔截器; -->
<interceptor-ref name="defaultState" />
<interceptor-ref name="自定義攔截器的名稱" />
</ interceptor-stack ><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>