Struts2攔截器實現原理

不設限發表於2011-12-21

攔截器的實現主要靠得是一個攔截器鏈,另外的一個是攔截器的呼叫的類,它的目的就是在真正執行Action方法之前加入一些額外的處理程式碼


Action類

public class Action {
public  String execute() {
return "success";
}
}


攔截器介面:

public interface Interceptor {
public void intercept(ActionInvocation invocaion);
}

攔截器實現類1

public class FirstInterceptor implements Interceptor {
@Override
public void intercept(ActionInvocation invocaion) {
System.out.println("first before");
invocaion.invoke();
System.out.println("first end");
}
}

攔截器實現類2

public class SecondInterceptor implements Interceptor {
@Override
public void intercept(ActionInvocation invocaion) {
System.out.println("second before");
invocaion.invoke();
System.out.println("second end");
}
}

ActionInvocation類

public class ActionInvocation {
private List<Interceptor> interceptors=new ArrayList<Interceptor>();
private int index=-1;
Action action = new Action();
public ActionInvocation() {
interceptors.add(new FirstInterceptor());
interceptors.add(new SecondInterceptor());
}

public void invoke() {
index++;
if(index>=interceptors.size()) {
action.execute();
} else {
interceptors.get(index).intercept(this);
}
}
}


呼叫攔截器測試類

public class Test{
public static void main(String[] args) {
System.out.println("main before");
new ActionInvocation().invoke();
System.out.println("main before");
}
}


自定義攔截器:
自定義攔截器必須要實現Interceptor介面
public class MyInterceptor implements Interceptor {
public void destroy() {

}
public void init() {
}


public String intercept(ActionInvocation invocation) throws Exception {
long start = System.currentTimeMillis();
String r = invocation.invoke();
long end = System.currentTimeMillis();
System.out.println("action time = " + (end - start));
return r;
}
}


使用的時候需要在struts.xml檔案中進行配置,而且攔截器是必須配置在包裡面的.


<action name="test" class="com.bjsxt.action.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

因為每一個攔截器都是攔截的一個指定的請求,所以攔截器需要定義在具體Action裡面


使用struts2 token攔截器:

這個攔截器主要是為了防止客戶重複提交表單而加入的

 使用token標籤的時候,Struts2會建立一個GUID(全域性唯一的字串)放在session中,並且會成為一個hidden放在form中。 
token攔截器會判斷客戶端form提交的token和session中儲存的session是否equals。如果equals則執行Action。否則攔截器直接返回invaid.token結果,Action對應的方法也不會執行介面.

使用步驟:

1.在對應的需要防止客戶重複提交表單的Action裡面加入攔截器


<action name="user" class="com.bjsxt.action.UserAction">
<result>/addOK.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>

<!--當表單重複提價的時候指向的頁面-->
<result name="invalid.token">/error.jsp</result>
</action>

2.在對應的表單裡面加上<s:token/>標記

<form action="test/input">
  輸入姓名:<input type="text" name="name"/>
  <input type="submit" value="提交"/>
  <s:token/>

相關文章