struts——攔截器

 

什麼是攔截器html

 

攔截器(Interceptor)是Struts 2的一個強有力的工具,有許多功能都是構建於它之上,如國際化(前兩篇博客介紹過)、轉換器,校驗等。java

 

攔截器是動態攔截Action調用的對象。它提供了一種機制可使開發者能夠定義在一個action執行的先後執行的代碼,也能夠在一個action執行前阻止其執行。同時也是提供了一種能夠提取action中可重用的部分的方式。apache

 

說到攔截器有一個東西不 能落下——攔截器鏈(Interceptor Chain,在Struts 2中稱爲攔截器棧Interceptor Stack)。攔截器鏈就是將攔截器按必定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其以前定義的順序被調用。cookie

 


 

實現原理session

 

Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,而後串成一個列表(list),最後一個一個地調用列表中的攔截器。
app

 


 


 


 

Struts 2提供了豐富多樣的,功能齊全的攔截器實現。你們能夠到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看關於默認的攔截器與攔截器鏈的配置。
jsp

 


 

相關說明以下:ide

 


 

 

 

 

攔截器工具

名字字體

說明

Alias Interceptor

alias

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

Chaining Interceptor

chain

讓前一個Action的屬性能夠被後一個Action訪問,如今和chain類型的result()結合使用。

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中。

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

 

 

在struts.xml中添加以下配置:

<!-- 配置全局攔截器 -->

<package name="all" extends="struts-default">
        <interceptors>
            <!-- 定義權限控制攔截器 -->
            <interceptor name="authority"
                class="akai.cost.ms.base.AuthInterceptor" />
            <!-- 定義一個包含權限控制的攔截器棧 -->
            <interceptor-stack name="mydefault">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="authority" />
            </interceptor-stack>
        </interceptors>
        <!-- 定義默認攔截器 -->
        <default-interceptor-ref name="mydefault" />
        <!-- 定義全局處理結果 -->
        <global-results>
            <!-- 邏輯名爲login的結果,映射到/login.jsp頁面 -->
            <result name="login">/login.jsp</result>
        </global-results>

    </package>

使用方法:其餘包繼承這個包名就能夠了

<package name="abc" extends="all" namespace="/">


:攔截器類

 

    1. package akai.cost.ms.base;  
    2.   
    3. import javax.servlet.http.HttpSession;  
    4.   
    5. import org.apache.struts2.ServletActionContext;  
    6.   
    7. import com.opensymphony.xwork2.Action;  
    8. import com.opensymphony.xwork2.ActionInvocation;  
    9. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
    10.   
    11. public class AuthInterceptor extends AbstractInterceptor{  
    12.   
    13.     @Override  
    14.     public String intercept(ActionInvocation invocation) throws Exception {  
    15.         HttpSession session = ServletActionContext.getRequest().getSession();  
    16.         String userName = (String)session.getAttribute("System_UserName");  
    17.         if(userName == "" || userName == null){//錯誤,回到登陸界面  
    18.             return Action.LOGIN;  
    19.         }else{  
    20.             return invocation.invoke();  
    21.         }  
    22.     }  
    23.   
    24.  

    25. 或者:
    26. 定義攔截器
      [html] view plain copy 在CODE上查看代碼片派生到個人代碼片
      1. <package name="MyInterceptor" extends="struts-default" namespace="/">  
      2.     <interceptors>  
      3.         <!-- 配置攔截器 -->  
      4.         <interceptor name="攔截器名" class="攔截器實現類完整路徑"/>  
      5.         <!-- 配置攔截器棧 -->  
      6.         <interceptor-stack name="攔截器棧名">  
      7.              <interceptor-ref name="攔截器一"/>  
      8.              <interceptor-ref name="攔截器二"/>  
      9.              ...................................  
      10.         </interceptor-stack>  
      11.     </interceptors>  
      12. </package>  


      將攔截器配置到action
      [html] view plain copy 在CODE上查看代碼片派生到個人代碼片
      1. <action name="login" class="com.action.LoginAction">  
      2.     <result name="success">/success.jsp</result>  
      3.     <result name="error">/error.jsp</result>  
      4.     <!-- 引用攔截器,通常配置在result後面 -->    
      5.     <interceptor-ref name="攔截器名或攔截器棧名"/>  
      6.     <!-- 引用Struts默認攔截器 -->  
      7.     <interceptor-ref name="defaultStack"/>  
      8. </action>  
      須要注意的是,必需要引用Struts默認的攔截器,不然會報錯。


      實現自定義攔截器:

      經過實現接口com.opensymphony.xwork2.interceptor.Interceptor可自定義攔截器。該接口提供了三個方法:
      1)  void init(); 在該攔截器被初始化以後,在該攔截器執行攔截以前,系統回調該方法。對於每一個攔截器而言,此方法只執行一次。
      2)  void destroy();該方法跟init()方法對應。在攔截器實例被銷燬以前,系統將回調該方法。
      3)  String intercept(ActionInvocation invocation) throws Exception; 該方法是用戶須要實現的攔截動做。該方法會返回一個字符串做爲邏輯視圖。
      除此以外,經過繼承類com.opensymphony.xwork2.interceptor.AbstractInterceptor等方法也可自定義攔截器,這裏不過多介紹。


      攔截器實例

      自定義攔截器MyInterceptor,實現Interceptor接口
      [java] view plain copy 在CODE上查看代碼片派生到個人代碼片
      1. package com.interceptor;  
      2.   
      3. import java.util.Map;  
      4.   
      5. import com.opensymphony.xwork2.ActionInvocation;  
      6. import com.opensymphony.xwork2.interceptor.Interceptor;  
      7. import com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod;  
      8.   
      9. public class MyInterceptor implements Interceptor {  
      10.   
      11.     @Override  
      12.     public void destroy() {  
      13.         System.out.println("---------destroy()---------");  
      14.     }  
      15.   
      16.     @Override  
      17.     public void init() {  
      18.         System.out.println("---------init()---------");  
      19.     }  
      20.   
      21.     @Override  
      22.     public String intercept(ActionInvocation invocation) throws Exception {  
      23.         System.out.println("---------intercept()---------");  
      24.         Map session = invocation.getInvocationContext().getSession();  
      25.         if (session.get("username") != null) {  
      26.             return invocation.invoke();  
      27.         } else {  
      28.             return "login";  
      29.         }  
      30.           
      31.     }  
      32.   
      33. }  


      攔截器的配置
      [html] view plain copy 在CODE上查看代碼片派生到個人代碼片
      1. <?xml version="1.0" encoding="UTF-8" ?>  
      2. <!DOCTYPE struts PUBLIC  
      3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
      4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
      5.   
      6. <struts>  
      7.     <constant name="struts.action.extension" value=","></constant>  
      8.     <package name="testLogin" namespace="/" extends="struts-default"  >  
      9.         <interceptors>  
      10.           
      11.             <interceptor name="MyInterceptor" class="com.interceptor.MyInterceptor"></interceptor>  
      12.               
      13.             <interceptor-stack name="defaultInterceptorStack">  
      14.                 <interceptor-ref name="MyInterceptor"></interceptor-ref>  
      15.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
      16.             </interceptor-stack>  
      17.         </interceptors>  
      18.           
      19.         <!--配置默認攔截器,全部該包內的action若是沒有單獨配置攔截器,則默認執行默認攔截器-->  
      20.         <default-interceptor-ref name="defaultInterceptorStack"></default-interceptor-ref>  
      21.           
      22.         <action name="login" class="com.action.LoginAction">  
      23.             <result name="success" type="redirect">/success.jsp</result>  
      24.             <result name="error" type="redirect">/error.jsp</result>  
      25.             <result name="login">login.jsp</result>  
      26.         </action>  
      27.     </package>  
      28. </struts>  

      annoction註解中使用攔截器和攔截棧

      1 //直接在類名稱的上端寫入便可,value中指定要引入的攔截器的名稱便可 2 @InterceptorRef(value="token") 3 //攔截棧的引用,藍色字體即攔截棧的引用名稱 4 @InterceptorRefs(@InterceptorRef("sessionCheckStack"))

      進入系統的時候,攔截器檢查是否登陸,如未登陸,轉到登陸頁;如已登陸,轉到成功頁。

      攔截器是Struts 2比較重要的一個功能。經過正確地使用攔截器,咱們能夠編寫可複用性很高的代碼。
相關文章
相關標籤/搜索