1. 程式人生 > >Struts2攔截器再認識

Struts2攔截器再認識

攔截器(Interceptor)是 Struts 2 的核心組成部分。

  1. Struts2 很多功能都是構建在攔截器基礎之上的,例如檔案的上傳和下載、國際化、資料型別轉換和資料校驗等等。
  2. Struts2 攔截器在訪問某個 Action 方法之前或之後實施攔截 Struts2 攔截器是可插拔的, 攔截器是 AOP(面向切面程式設計) 的一種實現.
  3. 攔截器棧(Interceptor Stack): 將攔截器按一定的順序聯結成一條鏈. 在訪問被攔截的方法時,
  4. Struts2 攔截器鏈中的攔截器就會按其之前定義的順序被依次呼叫

struts2自帶的攔截器:

自定義規則

struts2提供的 interceptor-stack 不是讓我們偷懶的,很多時候,我定義自己很多的攔截器,每一個攔截器在不同業務場景下是不同的,我們不能為了圖方便,把所以攔截器全部配置為一個攔截器棧來使用,這回極大的加強伺服器的負擔,

比如說:methodFirstceptor 是一個方法攔截器,我們配置需要攔截的方法,而function 攔截器又不需要攔截相關的方法,所以就沒有必要把他們放在一起。

<!-- 攔截器棧配置屬於自己的攔截器規則 -->
            <interceptor-stack name="mystack">
                <
interceptor-ref name="methodFirstceptor"></interceptor-ref> <interceptor-ref name="funtion"></interceptor-ref> <interceptor-ref name="defaultStack"> <param name="fileUpload.maximumSize">2097152</param> <!--
<param name="fileUpload.allowedTypes">text/html,text/xml</param> --> <param name="fileUpload.allowedExtensions">html,dtd,xml</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack>

普通攔截器:

 1 //可以實現Interceptor
 2 public class MyInterceptor extends AbstractInterceptor {
 3 
 4     /**
 5      * 
 6      */
 7     private static final long serialVersionUID = 1L;
 8     @Override
 9     public String intercept(ActionInvocation invocation) throws Exception {
10         
11         System.out.println("before invocation.invoke...");
12         
13         //可以不呼叫
14         String result = invocation.invoke();
15         
16         System.out.println("after invocation.invoke...");
17         
18         return "success";
19     }
20 }

方法攔截器:

 1 public class MethodFirstceptor extends MethodFilterInterceptor {
 2     /**
 3      * 
 4      */
 5     private static final long serialVersionUID = 1L;
 6 
 7     @Override
 8     protected String doIntercept(ActionInvocation aInvocation) throws Exception {
 9         System.out.println("進入方法攔截器");
10         String str = aInvocation.invoke();
11         System.out.println("退出方法攔截器");
12         return str;
13     }
14 
15     @Override
16     public Set<String> getExcludeMethodsSet() {
17         // TODO Auto-generated method stub
18         return super.getExcludeMethodsSet();
19     }
20 
21     @Override
22     public Set<String> getIncludeMethodsSet() {
23         // TODO Auto-generated method stub
24         return super.getIncludeMethodsSet();
25     }
26 }

struts2配置檔案:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 
 6 <struts>
 7 
 8 
 9     <!-- 配置國際化資原始檔 -->
10     <constant name="struts.custom.i18n.resources" value="i18n"></constant>
11     <constant name="struts.devMode" value="true"></constant>
12 
13     <package name="default" namespace="/" extends="struts-default">
14 
15         <interceptors>
16         <!--方法攔截器配置 -->
17             <interceptor name="methodFirstceptor"
18                 class="interceptors.MethodFirstceptor">
19                 <!--配置引數 :攔截什麼方法 -->
20                 <!--includeMethods控制能訪問哪些 -->
21                 <param name="includeMethods">add</param>
22                 <!--excludeMethods控制能訪問哪些 -->
23             </interceptor>
24 
25             <!-- 自定義攔截器 -->
26             <interceptor name="hello"
27                 class="interceptors.MyInterceptor"></interceptor>
28 
29             <!-- 攔截器棧配置屬於自己的攔截器規則 -->
30             <interceptor-stack name="mystack">
31                 <interceptor-ref name="methodFirstceptor"></interceptor-ref>
32                 <interceptor-ref name="hello"></interceptor-ref>
33                 <interceptor-ref name="defaultStack">
34                     <param name="fileUpload.maximumSize">2097152</param>
35                     <!-- <param name="fileUpload.allowedTypes">text/html,text/xml</param> -->
36                     <param name="fileUpload.allowedExtensions">html,dtd,xml</param>
37                 </interceptor-ref>
38                 <interceptor-ref name="defaultStack"></interceptor-ref>
39             </interceptor-stack>
40 
41         </interceptors>
42 
43         <default-interceptor-ref name="mystack"></default-interceptor-ref>
44     
45         <!-- 執行預設的方法的時候 是不會被攔截的 -->
46         <action name="loginAction" class="action.LoginAction">
47             <interceptor-ref name="mystack"></interceptor-ref>
48             <result>/success.jsp</result>
49         </action>
50         
51         <!-- 執行要攔截的方法 -->
52         <action name="addAction" class="action.LoginAction" method="add">
53             <interceptor-ref name="mystack"></interceptor-ref>
54             <result>/success.jsp</result>
55         </action>
56         
57         
58 
59 
60         <action name="testUpload" class="upload.UploadAction">
61             <result>/success.jsp</result>
62             <result name="input">/upload.jsp</result>
63         </action>
64 
65         <action name="testUpload2" class="upload.MulUploadAction">
66             <result>/success.jsp</result>
67             <result name="input">/uploadmul.jsp</result>
68         </action>
69 
70         <action name="testDownload" class="download.DownLoadAction">
71             <result type="stream">
72                 <param name="bufferSize">2048</param>
73                 <!-- <param name="contentType">${contentType}</param> -->
74                 <!-- 呼叫當前action中的getContentType()方法 -->
75                 <param name="contentDisposition">attachment;filename=${filename}</param>
76                 <param name="inputStream">${inputStream}</param>
77                 <!-- 呼叫當前action中的getInputStream()方法 -->
78             </result>
79         </action>
80 
81         <!-- 表單重複提交問題 -->
82 
83         <action name="testToken" class="token.TokenAction">
84             <interceptor-ref name="mystack"></interceptor-ref>
85             <!-- 會轉到標記為invalid-token的頁面 -->
86             <!-- <interceptor-ref name="token"></interceptor-ref> -->
87             <!-- 停留在當前頁面,不做任何操作 -->
88             <interceptor-ref name="tokenSession"></interceptor-ref>
89             <!-- 必須呼叫預設的攔截器 -->
90             <interceptor-ref name="defaultStack"></interceptor-ref>
91             <result>/success.jsp</result>
92             <result name="invalid.token">/token-error.jsp</result>
93         </action>
94 
95     </package>
96 
97 
98 </struts>