默認的攔截器在設計的時候就能知足大部分的應用,因此不少時候就不須要添加自定義的攔截器或者修改攔截器棧。不少action有各類各樣的需求,好比輸入驗證、文件上傳、防止屢次提交等等。因而struts框架就提供了一個解決方案,Interceptor
策略。當你請求一個action時,在執行當前action以前,會執行攔截,執行完action以後會再次進行攔截。這個過程通稱爲攔截器
。java
因爲攔截器在action執行先後都會被執行,因此struts2的框架的核心功能大部分都做爲攔截器進行實現,好比類型轉換、數據驗證等等,而且這些功能都是可插拔的,因此在使用時能夠決定action使用哪些功能。自定義的攔截器能夠和框架內置的攔截器進行混合使用,通常狀況攔截器都被默認配置成爲action執行的基礎。若類型轉換失敗,或者數據驗證失敗,攔截器就會阻止action的執行。spring
在大部分應用中,若是會屢次使用同一系列的攔截器,能夠將這些攔截器進行整理,聚合成Interceptor Stack
。安全
<package name="default" extends="struts-default"> <interceptors> <interceptor name="timer" class=".."/> <interceptor name="logger" class=".."/> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> </interceptor-stack> </interceptors> <action name="login" class="tutuorial.Login"> <interceptor-ref name="myStack"/> <result name="input">login.jsp</result> <result name="success" type="redirectAction">/secure/home</result> </action> </package>
struts2框架默認的攔截器在struts2-core-2.3.24.1.jar
包中的struts-default.xml
中。cookie
Interceptor | Name | Description |
---|---|---|
Alias Interceptor | alias | 容許參數在跨越多個請求時使用不一樣別名,這個攔截器可將多個action使用不一樣名字連接起來,而後用於處理同一信息 |
Chaining Interceptor | chain | 容許當前action可以使用上一個被執行action的屬性,這個攔截器一般要和「chain」結果類型一塊兒使用(<result type=」chain」…/>) |
Checkbox Interceptor | checkbox | 爲沒有被選定的多選框增長一個值爲false的參數,協助管理多選框(在HTTP請求裏,那些沒有被選定的多選框一般是沒有任何信息的 |
Cookie Interceptor | cookie | 使用配置的name,value來指定cookies |
CookieProvider Interceptor | cookieProvider | 將cookies從action傳輸到response |
Conversion Error Interceptor | conversionError | 將轉換錯誤的信息(包括轉換的字符串和參數類型等)存放到action的字段錯誤集裏去 |
Create Session Interceptor | createSession | 自動建立一個HttpSession會話(若是會話不存在),用來爲須要使用到HttpSession的攔截器服務 |
DebuggingInterceptor | debugging | 當使用Struts2的開發模式時,此攔截器會提供更多的調試信息,爲開發者提供幾種不一樣調試界面 |
DeprecationInterceptor | deprecation | 當devMode設置爲on,會將全部未知或過期的設置打上log |
Execute and Wait Interceptor | execAndWait | 當action在後臺執行時,給用戶顯示一個過渡性的等待頁面 |
Exception Interceptor | exception | 將action拋出的異常映射到結果,這樣就經過重定向來自動處理異常,通常狀況下,應該爲最後一個攔截器 |
File Upload Interceptor | fileUpload | 此攔截器主要用於文件上傳,它負責解析表單中文件域的內容 |
I18n Interceptor | i18n | 這是支持國際化的攔截器,它負責把所選的語言、區域放入用戶Session中 |
Logger Interceptor | logger | 經過輸出被執行action的名字,提供簡單的日誌功能,記錄用於追蹤的信息(可位於攔截器序列的不一樣位置) |
Message Store Interceptor | store | 在會話中爲action存儲和檢索消息、字段錯誤以及action錯誤,該攔截器要求action實現ValidationAware接口 |
Model Driven Interceptor | modelDriven | 這是一個用於模型驅動的攔截器,當某個Action類實現了ModelDriven接口時,它負責把getModel()方法的結果放入ValueStack中 |
Scoped Model Driven Interceptor | scopedModelDriven | 若是一個Action實現了一個ScopedModelDriven接口,該攔截器負責從指定生存範圍中找出指定的Modol,並將經過setModel方法將該Model傳給Action實例 |
Parameters Interceptor | params | 這是最基本的一個攔截器,它負責解析HTTP請求中的參數,並將參數值設置成Action對應的屬性值 |
Prepare Interceptor | prepare | 若是action實現Preparable接口,將會調用該攔截器的prepare()方法 |
Scope Interceptor | scope | 這是範圍轉換攔截器,它能夠將Action狀態信息保存到HttpSession範圍,或者保存到ServletContext範圍內。 |
Servlet Config Interceptor | servletConfig | 若是某個Action須要直接訪問ServletAPI,就是經過這個攔截器實現,它提供訪問HttpServletRequest和HttpServletResponse的方法,以map的方式訪問 |
Static Parameters Interceptor | staticParams | 設置action裏的靜態定義值(經過action配置裏的param標籤來實現);這個攔截器負責將struts.xml文件中<action>標籤下<param>標籤中的參數傳入action |
Roles Interceptor | roles | 這是一個JAAS(Java Authentication and Authorization Service,Java受權和認證服務)攔截器,只有當瀏覽者取得合適的受權後,才能夠調用被該攔截器攔截的Action |
Timer Interceptor | timer | 以執行action所花時間的形式,簡單記錄action概要信息,此攔截器負責輸出Action的執行時間,能夠利用此攔截器分析該Action的性能瓶頸 |
Token Interceptor | token | 以執行action所花時間的形式,簡單記錄action概要信息,此攔截器負責輸出Action的執行時間,能夠利用此攔截器分析該Action的性能瓶頸 |
Token Session Interceptor | tokenSession | 和Token相似,可是遇到無效的token會將提交數據保存到session中 |
Validation Interceptor | validation | 經過執行在xxxAction-validation.xml中定義的校驗器,從而完成數據校驗。 |
Default Workflow Interceptor | workflow | 爲action定義默認的工做流,通常跟在validation等其餘攔截器後,當驗證失敗時,不執行action而後重定向到INPUT視圖 |
Parameter Filter | Interceptor | N/A 控制action對參數的訪問(非默認配置 |
Profiling Interceptor | profiling | 容許action記錄簡單的概要信息日誌 |
Multiselect Interceptor | multiselect | 當一個select標籤設置成多選後(就是你寫的這種),沒有一個option被選中的時候,會自動設置一個空值 |
全部的攔截器都必須實現com.opensymphony.xwork2.interceptor.Interceptor
這個接口,以下:session
public interface Interceptor extends Serializable { void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; }
struts2的每個request會請求一個action,所以不用擔憂線程安全問題,可是Interceptor會在多個request的中使用,因此必需要保證線程安全。框架
咱們自定義的攔截器能夠繼承 AbstractInterceptor
抽象類, AbstractInterceptor
提供了一個而空的init和destory方法,若沒有實現這兩個方法的需求,能夠直接重寫intercept
方法。jsp
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class SimpleInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { MyAction action = (MyAction)invocation.getAction(); action.setDate(new Date()); return invocation.invoke(); } }
而後在struts2.xml文件中進行配置ide
<package name="struts-default"> <interceptors> <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor name="MyInterceptor" class="com.opensymphony.xwork2.spring.interceptor.SimpleInterceptor"/> ... </interceptors> </package>