js防止表單重復(fù)提交實(shí)現(xiàn)代碼
更新時(shí)間:2012年09月05日 20:19:38 作者:
重復(fù)提交、重復(fù)刷新、防止后退等等都是屬于系統(tǒng)為避免重復(fù)記錄而需要解決的問題,在客戶端去處理需要針對(duì)每一種的可能提出相應(yīng)的解決方案,然而在服務(wù)器端看來只不過是對(duì)于數(shù)據(jù)真實(shí)性的檢驗(yàn)問題
基于令牌的處理就是一勞永逸的方法。
<script Language='JavaScript'>
function formsubmit() {
Today = new Date();
var NowHour = Today.getHours();
var NowMinute = Today.getMinutes();
var NowSecond = Today.getSeconds();
var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;
if((mysec-document.formsubmitf.mypretime.value)>600){
//600只是一個(gè)時(shí)間值,就是5分鐘內(nèi)禁止重復(fù)提交,值隨便設(shè)
document.formsubmitf.mypretime.value=mysec;
}
else{
alert(' 按一次就夠了,請(qǐng)勿重復(fù)提交!請(qǐng)耐心等待!謝謝合作!');
return false;
}
document.forms.formsubmitf.submit();
}
</script>
防止網(wǎng)頁后退–禁止緩存
通過控制瀏覽器的緩存及頁面的有效期,當(dāng)在重定向之后的新頁面上點(diǎn)擊瀏覽器后退按鈕時(shí),會(huì)提示”網(wǎng)頁已過期”,從而防止后退時(shí)導(dǎo)致表單被提交。但這種方式不是對(duì)所有瀏覽器都是有效的,所以要考慮后再使用。在response時(shí)在header中添加如下代碼來控制瀏覽器的緩存及網(wǎng)頁的有效期限或直接在網(wǎng)頁的<meta>中添加:
<?php
//.....
///在IE 4或5中,Cache-Control標(biāo)記將被忽略,不起作用
header('Cache-Control: no-cache');
header('Expires: 0');
//對(duì)于https有效,與“Expires: -1”相同,此時(shí)瀏覽器仍舊緩存頁面,但把頁面標(biāo)記為立即過期
header('Pragma:no-cache');
//....
?>
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);
}
}
asp來做實(shí)例
表單文件formtest.asp
<%
Randomize '初始代隨機(jī)數(shù)種子
num1=rnd() '產(chǎn)生隨機(jī)數(shù)num1
num1=int(26*num1)+65 '修改num1的范圍以使其是A-Z范圍的Ascii碼,以防表單名出錯(cuò)
session("antry")="test"&chr(num1) '產(chǎn)生隨機(jī)字符串
%>
<form name="test" action="testact.asp" method="post">
你的名字:<input type='text' name='' size=30> '注意本行中使用了隨機(jī)表單項(xiàng)名
<input type='submit' value='提交'>
</form>
表單處理程序testact.asp
<%
teststr=request.form(session("antry"))
if teststr="" then
response.write "沒有填寫姓名或重復(fù)提交"
'由于用戶沒有填寫名字,或表單被重復(fù)提交(標(biāo)志為session("antry")為空)引起
else
response.write teststr
session("antry")="" '提交成功,清空session("antry"),以防重復(fù)提交!!
end if
%>
在這里,你只需隨機(jī)化一個(gè)必填項(xiàng)目的表單項(xiàng)名即可,不必隨機(jī)化所有的表單項(xiàng)目
復(fù)制代碼 代碼如下:
<script Language='JavaScript'>
function formsubmit() {
Today = new Date();
var NowHour = Today.getHours();
var NowMinute = Today.getMinutes();
var NowSecond = Today.getSeconds();
var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;
if((mysec-document.formsubmitf.mypretime.value)>600){
//600只是一個(gè)時(shí)間值,就是5分鐘內(nèi)禁止重復(fù)提交,值隨便設(shè)
document.formsubmitf.mypretime.value=mysec;
}
else{
alert(' 按一次就夠了,請(qǐng)勿重復(fù)提交!請(qǐng)耐心等待!謝謝合作!');
return false;
}
document.forms.formsubmitf.submit();
}
</script>
防止網(wǎng)頁后退–禁止緩存
通過控制瀏覽器的緩存及頁面的有效期,當(dāng)在重定向之后的新頁面上點(diǎn)擊瀏覽器后退按鈕時(shí),會(huì)提示”網(wǎng)頁已過期”,從而防止后退時(shí)導(dǎo)致表單被提交。但這種方式不是對(duì)所有瀏覽器都是有效的,所以要考慮后再使用。在response時(shí)在header中添加如下代碼來控制瀏覽器的緩存及網(wǎng)頁的有效期限或直接在網(wǎng)頁的<meta>中添加:
復(fù)制代碼 代碼如下:
<?php
//.....
///在IE 4或5中,Cache-Control標(biāo)記將被忽略,不起作用
header('Cache-Control: no-cache');
header('Expires: 0');
//對(duì)于https有效,與“Expires: -1”相同,此時(shí)瀏覽器仍舊緩存頁面,但把頁面標(biāo)記為立即過期
header('Pragma:no-cache');
//....
?>
action有這樣的一個(gè)方法生成令牌
復(fù)制代碼 代碼如下:
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);
}
}
asp來做實(shí)例
表單文件formtest.asp
復(fù)制代碼 代碼如下:
<%
Randomize '初始代隨機(jī)數(shù)種子
num1=rnd() '產(chǎn)生隨機(jī)數(shù)num1
num1=int(26*num1)+65 '修改num1的范圍以使其是A-Z范圍的Ascii碼,以防表單名出錯(cuò)
session("antry")="test"&chr(num1) '產(chǎn)生隨機(jī)字符串
%>
<form name="test" action="testact.asp" method="post">
你的名字:<input type='text' name='' size=30> '注意本行中使用了隨機(jī)表單項(xiàng)名
<input type='submit' value='提交'>
</form>
表單處理程序testact.asp
復(fù)制代碼 代碼如下:
<%
teststr=request.form(session("antry"))
if teststr="" then
response.write "沒有填寫姓名或重復(fù)提交"
'由于用戶沒有填寫名字,或表單被重復(fù)提交(標(biāo)志為session("antry")為空)引起
else
response.write teststr
session("antry")="" '提交成功,清空session("antry"),以防重復(fù)提交!!
end if
%>
在這里,你只需隨機(jī)化一個(gè)必填項(xiàng)目的表單項(xiàng)名即可,不必隨機(jī)化所有的表單項(xiàng)目
相關(guān)文章
不使用XMLHttpRequest實(shí)現(xiàn)異步加載 Iframe和script
運(yùn)用Iframe和script可以實(shí)現(xiàn)簡單的異步加載,沒有使用XMLHttpRequest,需要的朋友可以參考下2012-10-10JS實(shí)現(xiàn)點(diǎn)擊復(fù)選框變更DIV顯示狀態(tài)的示例代碼
下面小編就為大家分享一篇JS實(shí)現(xiàn)點(diǎn)擊復(fù)選框變更DIV顯示狀態(tài)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12如何使用js正則表達(dá)式驗(yàn)證文件夾名是否符合規(guī)范
眾所周知正則表達(dá)式非常強(qiáng)大,下面這篇文章主要給大家介紹了關(guān)于如何使用js正則表達(dá)式驗(yàn)證文件夾名是否符合規(guī)范的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05JavaScript實(shí)現(xiàn)Java中StringBuffer的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)Java中StringBuffer的方法,實(shí)例分析了StringBuffer類的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2015-02-02原生js實(shí)現(xiàn)查找/添加/刪除/指定元素的class
查找、添加、刪除、指定元素的class使用原生js實(shí)現(xiàn)不可思議吧,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04JS學(xué)習(xí)筆記之原型鏈和利用原型實(shí)現(xiàn)繼承詳解
這篇文章主要介紹了JS學(xué)習(xí)筆記之原型鏈和利用原型實(shí)現(xiàn)繼承,結(jié)合實(shí)例形式詳細(xì)分析了javascript原型鏈以及利用原型實(shí)現(xiàn)繼承的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-05-05ES6中解構(gòu)賦值實(shí)現(xiàn)變量批量賦值解放雙手
這篇文章主要為大家介紹了ES6中解構(gòu)賦值實(shí)現(xiàn)變量批量賦值解放雙手,變量的解構(gòu)賦值,聽起來很復(fù)雜,簡單點(diǎn)說可以理解成批量操作變量賦值2022-04-04