struts有自帶的Token(令牌)的機制來解決重復提交(包括后退,刷新等).舉例:
假設:假設有一個新增用戶的填寫表單頁面,填寫完后點擊"提交"按鈕完成數據庫錄入功能,要求不能重復提交(指類似刷新頁面的情況).此時,需要有兩個action(第一個action用來生成hidden的token值.第二個action用來校驗token值,通過判斷來決定是不是重復提交,不是則提交操作,否則提示錯誤)和至少一個頁面(保存token值和填寫用戶信息的錄入頁面)來完成校驗是否重復提交.此處有兩個頁面來完成.
為了方便,用戶表只有兩個字段用戶名<username>和密碼<password>:
具體邏輯如下:
index.jsp--鏈接--> PrepareAddUserAction.java--轉發并生成token-->
addUser.jsp--提交-->
AddUserAction.java--首先校驗 '是否重復提交 ',是提示錯誤信息,不是,執行數據庫操作.
部分相關代碼(省略formbean的代碼):
========index.jsp========
<html>
<head> <title> 測試 </title> </head> <body>
<a href= " <%=request.getContextPath()%> /PrepareAddUserAction.java
"> 新增用戶 </a>
</body> </html>
=========PrepareAddUserAction.java=========
package
com.tseyimwah.struts.action;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.struts.action.Action;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
public class
PrepareAddUserAction extends Action {
public ActionForward
execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws
HibernateException {
.........//相關方法
saveToken(request);
//在下一個頁面addUser.jsp生成hidden類型的token值
return mapping.findForward( "addUser
");//頁面跳轉
}
}
==========addUser.jsp=============
此處代碼沒有什么要求,含有form的普通struts頁面,代碼省略,里面的 "提交 "按紐給AddUserAction.java,即
<html:form action= "/AddUserAction.do " method= "post ">
============AddUserAction.java=====
package
com.tseyimwah.struts.action;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.struts.action.Action;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
public class AddUserAction
extends Action {
public ActionForward execute(
ActionMapping
mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
//判斷token值,如果是重復提交跳轉到錯誤頁面則提示出錯信息,否則執行相關的數據庫操作
if
(!isTokenValid(request)){
request.setAttribute(GlobalKeys.MESSAGE_ID, "不允許重復提交! ");//設置出錯信息
return (mapping.findForward( "errorPage "));
} else
resetToken(request); //重新設置token值,可不用
}
......
......//其他的相關方法,如設置相關屬性值,調用相關的數據庫操作等
return (mapping.findForward(
"addUserSucess "));//新增用戶成功的頁面
}
這只是將相關的必要代碼寫出,根據需要可以改寫相關的代碼.