(1) 避免表單的重複送出的方式:
Ø 采用HttpServletRequest.sendRedirect()方法将用戶端重定向到成功頁面。
Ø 在用戶端通過JavaScript實作;
Ø 在服務端編寫代碼實作。
(2) 在伺服器端避免表單重複送出,通常是采用<b>同步令牌</b>的方式來實作,其基本的原理如下:
(1)使用者通路包含表單的頁面,伺服器端在這次會話中,建立一個Session對象,并産生一個令牌值,将這個令牌值作為隐藏輸入域(<input>元素的type屬性為hidden)的值, 随表單一起發送到用戶端,同時将令牌值儲存到Session中。
(2)使用者送出頁面,伺服器端首先判斷請求參數中的令牌值和Session中儲存的令牌值是否相等,如果相等,則淸除Session中的令牌值,然後執行資料處理操作。如果不相等,則提示使用者己經送出過了表單,同時産生一個新的令牌值,儲存到Session中。當使用者重新通路送出資料頁面時,将新産生的令牌值作為隐藏輸入域的值。
(3) Struts 2的實作方式:
(1)需要在表單中使用<s:token>标簽,并置定一個令牌的名稱。例如:<s:token name=”user.token” />
(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<User> {
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())&&"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:
<body>
<s:form action="token">
<s:textfield name="name" label="姓名"></s:textfield><br>
<s:password name="password" label="密碼"></s:password><br>
<s:token></s:token><br>
<s:submit value="送出"></s:submit><br>
</s:form>
</body>
struts.xml
<package name="token" extends="struts-default">
<action name="token" class="com.mzsx.token.TokenAction">
<result name="success">/s15/success.jsp</result>
<result name="invalid.token">/s15/error.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1135799