前兩種是利用javascript
後面一種是在使用Struts的情況下的參考實現:
javascript
設置一個變量
只允許提交一次
<script language=javascript>
var checkSubmitFlg = false;
function checkSubmit()
{
if (checkSubmitFlg == true)
{
return false;
}
checkSubmitFlg = true;
return true;
}
documentondblclick =
function docondblclick()
{
windoweventreturnValue = false;
}
documentonclick =
function doconclick()
{
if (checkSubmitFlg)
{
windoweventreturnValue = false;
}
}
</script>
<html:form action=myActiondo
method=post onsubmit=return checkSubmit();>
還是javascript
將提交按鈕或者image置為disable
<html:form action=myActiondo
method=post
onsubmit=getElById(submitInput)
disabled = true;
return true;
>
<html:image
styleId=submitInput
src=images/ok_bgif
border= />
</html:form>
利用struts的同步令牌機制
利用同步令牌(Token)機制來解決Web應用中重復提交的問題
Struts也給出了一個參考實現
基本原理
服務器端在處理到達的請求之前
會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較
看是否匹配
在處理完該請求後
且在答復發送給客戶端之前
將會產生一個新的令牌
該令牌除傳給
客戶端以外
也會將用戶會話中保存的舊的令牌進行替換
這樣如果用戶回退到剛才的提交頁面並再次
提交的話
客戶端傳過來的令牌就和服務器端的令牌不一致
從而有效地防止了重復提交的發生
if (isTokenValid(request true))
{
// your code here
return mappingfindForward(success);
} else
{
saveToken(request);
return mappingfindForward
(submitagain);
}
Struts根據用戶會話ID和當前系統時間來生成一個唯一(對於每個會話)令牌的
具體實現可以參考TokenProcessor類中的generateToken()方法
//驗證事務控制令牌
會自動根據session中標識生成一個隱含input代表令牌防止兩次提交
在action中
//<input type=hidden
name=orgapaclTOKEN
// value=aaffdcccae>
if (!isTokenValid(request))
errorsadd(ActionErrorsGLOBAL_ERROR
new ActionError(errortransactiontoken));
resetToken(request);
//刪除session中的令牌
action有這樣的一個方法生成令牌
protected String generateToken
(HttpServletRequest request)
{
HttpSession session =
requestgetSession();
try
{
byte id[] =
sessiongetId()getBytes();
byte now[] =
new Long(SystemcurrentTimeMillis())
toString()getBytes();
MessageDigest md =
MessageDigestgetInstance(MD);
mdupdate(id);
mdupdate(now);
return (toHex(mddigest()));
} catch (IllegalStateException e)
{
return (null);
} catch (NoSuchAlgorithmException e)
{
return (null);
}
}
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19531.html