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的博客”