天天看點

Struts 2.x避免表單的重複送出——Token

 (1)       避免表單的重複送出的方式:

Ø  采用HttpServletRequest.sendRedirect()方法将用戶端重定向到成功頁面。

Ø  在用戶端通過JavaScript實作;

Ø  在服務端編寫代碼實作。

(2)       在伺服器端避免表單重複送出,通常是采用<b>同步令牌</b>的方式來實作,其基本的原理如下:

(1)使用者通路包含表單的頁面,伺服器端在這次會話中,建立一個Session對象,并産生一個令牌值,将這個令牌值作為隐藏輸入域(&lt;input&gt;元素的type屬性為hidden)的值, 随表單一起發送到用戶端,同時将令牌值儲存到Session中。

(2)使用者送出頁面,伺服器端首先判斷請求參數中的令牌值和Session中儲存的令牌值是否相等,如果相等,則淸除Session中的令牌值,然後執行資料處理操作。如果不相等,則提示使用者己經送出過了表單,同時産生一個新的令牌值,儲存到Session中。當使用者重新通路送出資料頁面時,将新産生的令牌值作為隐藏輸入域的值。

(3)       Struts 2的實作方式:

(1)需要在表單中使用&lt;s:token&gt;标簽,并置定一個令牌的名稱。例如:&lt;s:token name=”user.token” /&gt;

(2)為Action類配置應用TokenInterceptor或者TokenSessionStoreInterceptor攔截器,這兩個攔截器已經在struts-default.xml中定義,但沒有包含在default攔截器棧中.

TokenAction.java:

import com.opensymphony.xwork2.ActionSupport; 

import com.opensymphony.xwork2.ModelDriven; 

public class TokenAction extends ActionSupport implements ModelDriven&lt;User&gt; { 

    private static final long serialVersionUID = 7502909137522615270L; 

    private User user=new User(); 

    @Override 

    public User getModel() { 

        return user; 

    } 

    public String execute() throws Exception { 

        if ("qiang".equalsIgnoreCase(user.getName())&amp;&amp;"1234".equals(user.getPassword())) { 

            return SUCCESS; 

        } else { 

            return ERROR; 

        } 

User.java:

public class User { 

    private String name; 

    private String password; 

    //省略getter與setter方法 

token_login.jsp:

&lt;body&gt; 

    &lt;s:form action="token"&gt; 

        &lt;s:textfield name="name" label="姓名"&gt;&lt;/s:textfield&gt;&lt;br&gt; 

        &lt;s:password name="password" label="密碼"&gt;&lt;/s:password&gt;&lt;br&gt; 

        &lt;s:token&gt;&lt;/s:token&gt;&lt;br&gt; 

        &lt;s:submit value="送出"&gt;&lt;/s:submit&gt;&lt;br&gt; 

    &lt;/s:form&gt; 

  &lt;/body&gt; 

struts.xml

&lt;package name="token" extends="struts-default"&gt; 

        &lt;action name="token" class="com.mzsx.token.TokenAction"&gt; 

            &lt;result name="success"&gt;/s15/success.jsp&lt;/result&gt; 

            &lt;result name="invalid.token"&gt;/s15/error.jsp&lt;/result&gt; 

            &lt;interceptor-ref name="token"&gt;&lt;/interceptor-ref&gt; 

            &lt;interceptor-ref name="defaultStack"&gt;&lt;/interceptor-ref&gt; 

        &lt;/action&gt; 

    &lt;/package&gt; 

本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1135799