淺談 Struts2 攔截器

      Struts2框架是基於攔截器實現的,能夠對某個Action進行攔截,而後處理一些邏輯。攔截器至關於AOP裏面的環繞通知,即在Action方法的執行以前和以後根據須要添加相應的邏輯。事實上,即便struts.xml 沒有任何關於攔截器的配置,Struts2也會爲咱們添加一組默認的攔截器,最多見的是,請求參數自動綁定到Action對應的字段上(default Stack  默認攔截器棧中params攔截器)。html

 

Struts2中自定義攔截器的步驟是:java

1.定義攔截器類apache

2.爲Action配置自定義的攔截器類數據結構


以定義一個檢查是否有請求HelloWorldAction的權限爲例:框架

定義攔截器類

Java代碼  收藏代碼jsp

  1. package com.tom.interceptors;  ide


  2. import com.opensymphony.xwork2.ActionInvocation;  this

  3. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  spa

  4. import org.apache.struts2.ServletActionContext;  orm

  5.   

  6. //繼承AbstractInterceptor  

  7. public class PermissionCheckInterceptor extends AbstractInterceptor {  


  8.     @Override  

  9.     public String intercept(ActionInvocation invocation) throws Exception {  

  10.    

  11.        //取permit請求參數,true表示有權限,其它表示沒有權限  

  12.         String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];  

  13.   

  14.         Boolean permit = Boolean.valueOf(value);  

  15.         if (Boolean.TRUE.equals(permit)) {  

  16.             return invocation.invoke(); //調用Action的方法,並返回那個方法對應的結果視圖  

  17.         }  

  18.         //在checkResult視圖上顯示message信息  

  19.         ServletActionContext.getRequest().setAttribute("message""Permission denies");  

  20.         return "checkResult"//結果轉到checkResult對應的視圖  

  21.     }  

  22.   

  23. }  

 

 

定義HelloWorldAction

 

 

Java代碼  收藏代碼

  1. package com.tom.actions;  

  2.   

  3. public class HelloWorldAction {  

  4.     private String permit; //頁面上輸出permit的值  

  5.     private String message;  

  6.   

  7.     public String getMessage() {  

  8.         return message;  

  9.     }  

  10.   

  11.     public void setMessage(String message) {  

  12.         this.message = message;  

  13.     }  

  14.   

  15.     public String execute() {  

  16.         this.message = "Permission OK, the permit  value is: " + permit;  

  17.         return "checkResult";  

  18.     }  

  19.   

  20.     public String getPermit() {  

  21.         return permit;  

  22.     }  

  23.   

  24.     public void setPermit(String permit) {  

  25.         this.permit = permit;  

  26.     }  

  27. }  

 

 

配置struts.xml

 

 

Xml代碼  收藏代碼

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定義包級別攔截器,供包內action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--引用權限檢查攔截器,能夠定義多個-->  

  12.             <interceptor-ref name="permissionCheckInterceptor"/>  

  13.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  14.         </action>  

  15.     </package>  

  16. </struts>  

 

 

定義checkResult.jsp

Html代碼  收藏代碼

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  

  2. <html>  

  3. <head>  

  4.     <title></title>  

  5. </head>  

  6. <body>  

  7.     Check Result: ${message}  

  8. </body>  

  9. </html>  

 

訪問:

1. http://localhost:8080/hellons/hi?permit=false

頁面顯示:Check Result: Permission denies

 

2. http://localhost:8080/hellons/hi?permit=true

頁面顯示:Check Result: Permission OK, the permit value isnull

 

問題:

 在訪問http://localhost:8080/hellons/hi?permit=true時,結果顯示permit的值爲null,而根據Struts2的請求參數與Action字段的對應關係,value的值應該爲true纔對。這裏爲null表示Struts2並無完成請求參數與action字段的自動綁定,緣由是,當咱們配置HelloWorldAction的攔截器時,把Struts2默認配置到Action中的攔截器覆蓋了,這其中就包括參數綁定攔截器

 

 問題解決

Struts2在配置攔截器時,採用的是一種遞歸的數據結構,攔截器棧interceptor-stack能夠包含一組interceptor-ref也能夠包含interceptor-stack。

Struts2爲每一個Action默認配置的一組攔截器放置於名稱爲defaultStack的攔截器棧中。因此,當爲Action配置攔截器時,須要把默認攔截器配置上,而且默認攔截器應該在最前,由於默認攔截器包含了Struts基礎和核心功能,應該讓這些攔截器優先執行。

 

修改後的struts2.xml

 

Xml代碼  收藏代碼

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定義包級別攔截器,供包內action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--配置默認攔截器-->  

  12.             <interceptor-ref name="defaultStack"/>  

  13.             <!--引用權限檢查攔截器,能夠定義多個-->  

  14.             <interceptor-ref name="permissionCheckInterceptor"/>  

  15.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  16.         </action>  

  17.     </package>  

  18. </struts>  

 此時訪問http://localhost:8080/hellons/hi?permit=true,頁面顯示Check Result: Permission OK, the permit value is: true

 

 攔截器的其它配置方式

 1.定義並引用攔截器棧

Xml代碼  收藏代碼

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定義包級別攔截器,供包內action引用-->  

  7.         <interceptors>  

  8.             <!--自定義攔截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.               

  11.             <!--攔截器棧-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---攔截器內部只能引用其它的攔截器(<interceptor-ref name=... ),而不能使用定義攔截器(<interceptor name=... )-->  

  14.                 <!--默認攔截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定義攔截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  22.             <!--攔截器棧包含默認攔截器和自定義攔截器-->  

  23.             <interceptor-ref name="permissionCheckInterceptorStack"/>  

  24.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  25.         </action>  

  26.     </package>  

  27. </struts>  

 

 2.定義默認攔截器

 

Xml代碼  收藏代碼

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定義包級別攔截器,供包內action引用-->  

  7.         <interceptors>  

  8.             <!--自定義攔截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.   

  11.             <!--攔截器棧-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---攔截器內部只能引用其它的攔截器(<interceptor-ref name=... ),而不能使用定義攔截器(<interceptor name=... )-->  

  14.                 <!--默認攔截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定義攔截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <default-interceptor-ref name="permissionCheckInterceptorStack"/>  

  22.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  23.             <!--不配置攔截器,則若是包內有default-interceptor-ref定義的攔截器,則使用之。default-interceptor-ref定義的攔截器必須包含defaultStack攔截器棧-->  

  24.             <!--若是配置了攔截器,則default-interceptor-ref定義的攔截器不生效,defaultStack定義的攔截器也不生效-->  

  25.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  26.         </action>  

  27.     </package>  

  28. </struts>  

相關文章
相關標籤/搜索