Struts2攔截器

1.攔截器簡介

默認的攔截器在設計的時候就能知足大部分的應用,因此不少時候就不須要添加自定義的攔截器或者修改攔截器棧。不少action有各類各樣的需求,好比輸入驗證、文件上傳、防止屢次提交等等。因而struts框架就提供了一個解決方案,Interceptor策略。當你請求一個action時,在執行當前action以前,會執行攔截,執行完action以後會再次進行攔截。這個過程通稱爲攔截器java

因爲攔截器在action執行先後都會被執行,因此struts2的框架的核心功能大部分都做爲攔截器進行實現,好比類型轉換、數據驗證等等,而且這些功能都是可插拔的,因此在使用時能夠決定action使用哪些功能。自定義的攔截器能夠和框架內置的攔截器進行混合使用,通常狀況攔截器都被默認配置成爲action執行的基礎。若類型轉換失敗,或者數據驗證失敗,攔截器就會阻止action的執行。spring

2.攔截器配置

在大部分應用中,若是會屢次使用同一系列的攔截器,能夠將這些攔截器進行整理,聚合成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被選中的時候,會自動設置一個空值

3.自定義攔截器

全部的攔截器都必須實現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>
相關文章
相關標籤/搜索