javascript
在JSP客户端限制表单重复提交
在客戶端限制表單重復(fù)提交有兩種方法:
???????? 第一種:在javascript腳本中設(shè)置一個(gè)標(biāo)志變量,來(lái)區(qū)分表單是否已經(jīng)提交。如果已經(jīng)提交,則彈出對(duì)話框告訴用戶“重復(fù)提交”。
??????? 第二種:在單擊提交按鈕以后將提交按鈕設(shè)置為disabled狀態(tài),這樣用戶就無(wú)法再提交按鈕,客戶端也就無(wú)法重復(fù)提交。
??????? 采用第一種方法:
1.新建一個(gè)ClientTest1.jsp文件,代碼如下:
?
<%@ page language="java" contentType="text/html; charset=Gb2312"
??? pageEncoding="GB2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Gb2312">
<title>客戶端限制重復(fù)提交</title>
<script language="javascript"
??? <!--定義重復(fù)提交標(biāo)志變量 -->
??? var repeatSubmitFlag = false;
??? <!-- 重復(fù)提交檢查函數(shù) -->
??? function checkSubmit()
??? {
??????? if(repeatSubmitFlag) <!-- 如果標(biāo)志為true,則說(shuō)明頁(yè)面已經(jīng)提交 -->
??????? {
??????????? window.alert('禁止重復(fù)提交!');
??????????? return false;
??????? }
??????? else
??????? {
??????????? repeatSubmitFlag = true;
??????????? return true;
??????? }
??? }
</script>
</head>
<body bcolor="#ffffff">
??? <form name="form_client" action="http://www.dlmu.edu.cn" οnsubmit="return checkSubmit();">
??????? <input type="checkbox" name="check_1" checked=true/>大連海事大學(xué)
??????? <input type="submit" name="submitok"/>
??? </form>
</body>
</html>
?
? 2.如果重復(fù)提交表單就會(huì)彈出錯(cuò)誤提示對(duì)話框
??? 采用第二種方法:
1.新建一個(gè)ClientTest2.jsp文件,代碼如下:
<%@ page language="java" contentType="text/html; charset=GB2312"
??? pageEncoding="Gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Gb2312">
<title>客戶端限制重復(fù)提交-2</title>
</head>
<body bgcolor="#ffffff">
??? <form name="form_client" action="http://www.dlmu.edu.cn"
??????? οnsubmit="window.document.form_client.submitok.disabled=true; return true;">
??????? <input type="checkbox" name="check_1" checked="true"/>大連海事大學(xué)
??????? <input type="submit" name="submitok"/>
??? </form>
</body>
</html>
2.如果重復(fù)提交表單就會(huì)彈出錯(cuò)誤提示對(duì)話框?
?
3 利用struts的同步令牌機(jī)制
利用同步令牌(Token)機(jī)制來(lái)解決Web應(yīng)用中重復(fù)提交的問(wèn)題,Struts也給出了一個(gè)參考實(shí)現(xiàn)。
基本原理:
服務(wù)器端在處理到達(dá)的請(qǐng)求之前,會(huì)將請(qǐng)求中包含的令牌值與保存在當(dāng)前用戶會(huì)話中的令牌值進(jìn)行比較,看是否匹配。在處理完該請(qǐng)求后,且在答復(fù)發(fā)送給客戶端之前,將會(huì)產(chǎn)生一個(gè)新的令牌,該令牌除傳給客戶端以外,也會(huì)將用戶會(huì)話中保存的舊的令牌進(jìn)行替換。這樣如果用戶回退到剛才的提交頁(yè)面并再次提交的話,客戶端傳過(guò)來(lái)的令牌就和服務(wù)器端的令牌不一致,從而有效地防止了重復(fù)提交的發(fā)生。
if (isTokenValid(request, true)) {
// your code here
return mapping.findForward("success");
} else {
saveToken(request);
return mapping.findForward("submitagain");
}
Struts根據(jù)用戶會(huì)話ID和當(dāng)前系統(tǒng)時(shí)間來(lái)生成一個(gè)唯一(對(duì)于每個(gè)會(huì)話)令牌的,具體實(shí)現(xiàn)可以參考TokenProcessor類中的generateToken()方法。
1. //驗(yàn)證事務(wù)控制令牌,<html:form >會(huì)自動(dòng)根據(jù)session中標(biāo)識(shí)生成一個(gè)隱含input代表令牌,防止兩次提交
2. 在action中:
//<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
resetToken(request); //刪除session中的令牌
3. action有這樣的一個(gè)方法生成令牌
protected String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession();
try {
byte id[] = session.getId().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return (null);
} catch (NoSuchAlgorithmException e) {
return (null);
}
}
總結(jié)
以上是生活随笔為你收集整理的在JSP客户端限制表单重复提交的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过超链接提交表单
- 下一篇: 通用分页实现及其OO设计探讨