javascript
在JSP客户端限制表单重复提交
在客戶端限制表單重復提交有兩種方法:
???????? 第一種:在javascript腳本中設置一個標志變量,來區分表單是否已經提交。如果已經提交,則彈出對話框告訴用戶“重復提交”。
??????? 第二種:在單擊提交按鈕以后將提交按鈕設置為disabled狀態,這樣用戶就無法再提交按鈕,客戶端也就無法重復提交。
??????? 采用第一種方法:
1.新建一個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>客戶端限制重復提交</title>
<script language="javascript"
??? <!--定義重復提交標志變量 -->
??? var repeatSubmitFlag = false;
??? <!-- 重復提交檢查函數 -->
??? function checkSubmit()
??? {
??????? if(repeatSubmitFlag) <!-- 如果標志為true,則說明頁面已經提交 -->
??????? {
??????????? window.alert('禁止重復提交!');
??????????? 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/>大連海事大學
??????? <input type="submit" name="submitok"/>
??? </form>
</body>
</html>
?
? 2.如果重復提交表單就會彈出錯誤提示對話框
??? 采用第二種方法:
1.新建一個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>客戶端限制重復提交-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"/>大連海事大學
??????? <input type="submit" name="submitok"/>
??? </form>
</body>
</html>
2.如果重復提交表單就會彈出錯誤提示對話框?
?
3 利用struts的同步令牌機制
利用同步令牌(Token)機制來解決Web應用中重復提交的問題,Struts也給出了一個參考實現。
基本原理:
服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,看是否匹配。在處理完該請求后,且在答復發送給客戶端之前,將會產生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發生。
if (isTokenValid(request, true)) {
// your code here
return mapping.findForward("success");
} else {
saveToken(request);
return mapping.findForward("submitagain");
}
Struts根據用戶會話ID和當前系統時間來生成一個唯一(對于每個會話)令牌的,具體實現可以參考TokenProcessor類中的generateToken()方法。
1. //驗證事務控制令牌,<html:form >會自動根據session中標識生成一個隱含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有這樣的一個方法生成令牌
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);
}
}
總結
以上是生活随笔為你收集整理的在JSP客户端限制表单重复提交的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过超链接提交表单
- 下一篇: 通用分页实现及其OO设计探讨