如何防止表单的重复提交?(20分)

  • 主题发起人 主题发起人 isbo
  • 开始时间 开始时间
I

isbo

Unregistered / Unconfirmed
GUEST, unregistred user!
如何防止表单的重复提交?
 
按下提交按钮后把button的disabled属性该为ture.
 
没用,我按f5还是能提交
可以用session控制吧
 
 数据库里建个索引
 
每次递交对递交数据与库里数据进行对比!不是很繁琐的~!
 
看到很多登录页面上的那个防灌水随机码吗?
我没仔细看代码
我觉得可以这样做:
表单页可以开启一个session,比如session("Curid")=一个随机数字
同时表单中有个隐藏的Input,值就为这个数字,比如<input type='hidden' value='1980' name='frmCurid'>
提交后的页面上把session("curid") 和 request("frmCurid")做比较,一样就可以提交内容,不一样就报个错误信息
然后信息提交完毕后把session("curid") 赋个空值就成了
 
用session吧
 
gxcooo:
session怎样用?有举个例子吗?
 
简单的办法,提交后关闭该页面。或者不关闭,
处理后给出提示信息,并清空某必填项,这样提交就会不通过。
 
哈,大家原理,还没有清楚
重复提交,我这里指用F5了
当用F5时,会出现这种情况,
也就是表单没有真正的重复提交
提交的是已经提交过的东西
隐藏的Input这里不会起作用的
当然解决的方法,最好是用SESSION了
是用一个SESSION=SESSION+1
的形式了
我还没时间试,希望有人真正试过后再发言
 
其实用SESSION=SESSION+1和我说的把SESSION赋空的效果是一样的嘛,只要SESSION值和Input里的值肯定不一样不就成了
 
页面增加一个session,提交前为true,提交后为false.提交时检测一下.
 
我是这样处理的,把一个必填的字段的值提交后,修改为空值,然后检验函数就测到该值没有填而阻止表单数据发出,防止了数据的重复发送,但对于恶意重发没有效果。
 
我看大家想得太复杂了吧,只要在本地代码中用vbscript
加入一段检测代码就可以了
 
表单提交后将页面转至显示提交成功的信息,
这样就没有提交页面了,按F5也没用啦,是不是啊?
如果你一定还要显示提交页面的话,让我再想想
 
if page.ispostback then
enableviewstate=false
end if
 
yysun老大有篇文章讲这个问题的,要用数据字典,在大富翁的源程序里就用到,找来看看吧
 
网上看到的:
在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结果,如重复订阅邮件服务或重复投票等。
   本文介绍在ASP应用中防止用户在当前会话期间多次提交同一表单的一个简单方法。它主要由四个子程序组成,在较为简单的应用场合,你只要将这些代码放在包含文件中直接引用即可;对于那些较为复杂的环境,我们在文章的最后给出一些改进建议。
   一、基本工作过程
   下面我们依次讨论这四个子程序。
   (一)初始化
   这里我们要在Session对象中保存两个变量,其中:
   ⑴ 每一个表单对应一个称为FID的唯一标识,为使该值唯一要用到一个计数器。
   ⑵ 每当一个表单成功提交,必须在一个Dictionary对象中存储它的FID。
   我们用一个专用的过程来初始化上述数据。虽然以后各个子程序都要调用它,但实际上每一个会话期间它只执行一次:
Sub InitializeFID()
If Not IsObject(Session("FIDList")) then

Set Session("FIDList")=Server.CreateObject("Scripting.Dictionary")
Session("FID")=0
End If
End Sub

   (二)生成表单的唯一标识符
   下面这个函数GenerateFID()用于生成表单的唯一标志。该函数首先将FID值加1,然后返回它:
Function GenerateFID()
InitializeFID
Session("FID") = Session("FID") + 1
GenerateFID = Session("FID")
End Function

   (三)登记已提交表单
   当表单成功地提交时,在Dictionary对象中登记它的唯一标识:
Sub RegisterFID()
Dim strFID
InitializeFID
strFID = Request("FID")
Session("FIDlist").Add strFID, now()
End Sub

   (四)检查表单是否重复提交
   在正式处理用户提交的表单之前,应该在Dictionary对象中检查它的FID是否已经登记。下面的CheckFID()函数用来完成这个工作,如已经登记,它返回FALSE,否则返回TRUE:
Function CheckFID()
Dim strFID
InitializeFID
strFID = Request("FID")
CheckFID = not Session("FIDlist").Exists(strFID)
End Function

   二、如何使用
   有两个地方要用到上述函数,即表单生成时与结果处理时。假设上述四个子程序已经放入包含文件Forms.inc中,下面的代码根据FID值来决定生成表单还是处理表单结果,它所描述的处理过程适合于大多数ASP应用:
< %Option Explicit%>
< !--#include file="forms.inc"-->
< HTML>
< HEAD>
< TITLE>表单提交测试< /TITLE>
< /HEAD
< BODY>
< %
If Request("FID") = "" then

GenerateForm
else

ProcessForm
End If
%>
< /BODY>
< /HTML>

   GenerateForm负责生成表单,表单中应该含有一个隐藏的FID,如:
< %
Sub GenerateForm()
%>
< form action="< %=Request.ServerVariables("PATH_INFO")%>" method=GET>
< input type=hidden name=FID value="< %=GenerateFID()%>">
< input type=text name="param1" value="">
< input type=submit value="OK">
< /form>
< %
End Sub
%>

   ProcessForm负责处理通过表单提交的内容,但在处理之前应该先调用CheckFID()检查当前表单是否已经提交,代码类如:
< %
Sub ProcessForm()
If CheckFID() then

Response.Write "你输入的内容是" &amp;
Request.QueryString("param1")
RegisterFID
else

Response.Write "此表单只能提交一次!"
End If
End Sub
%>

   三、限制与改进措施
   上面我们介绍了在当前会话期间限制同一表单被多次提交的一种方法。在实际应用中可能需要从多方面加以改进,例如:
   ⑴ 在登记表单ID之前检查用户输入数据的合法性,使得数据不合法时用户可以按“后退”按钮返回,在修正后再次提交同一表单。
   ⑵ 这种对表单提交的限制最多只能在当前会话期间有效。如果要求这种限制能够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数据了。
   ⑶ 这种方法是不安全的。它仅用于防范误操作,不能防止熟练用户有意地多次提交同一表单。
 
1、表单里面加一个hidden的控件好了,值为1
2、表单提交的动作可以写在控制代码里面:
<script>
验证表单信息正确;
if (值=1){
hidden的控件.值=2
form.submit;
}else
{
alert(您的表单不可以重复提交)
}
</script>
这样就可以简单的实现 F5 不能重复提交了。
 
后退
顶部