NEWS

分享创造价值   合作实现共赢

限制同一表单多次提交的分析


同一表单多次提交有时候会产生某些预料不到的结果,比如重复订阅邮件或重复投票等。
  本文介绍在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

If Request("FID") = "" Then
GenerateForm
Else
ProcessForm
End If

GenerateForm负责生成表单,表单中应该含有一个隐藏的FID,如:
Sub GenerateForm()



End Sub
ProcessForm负责处理通过表单提交的内容,但在处理之前应该先调用CheckFID()检查当前表单是否已经提交,代码类如:
 
Sub ProcessForm()
If CheckFID() Then
Response.Write "你输入的内容是"Request.QueryString("param1")
RegisterFID
Else
Response.Write "此表单只能提交一次!"
End If
End Sub

三、同一表单多次提交的限制与改进措施
  上面我们介绍了在当前会话期间限制同一表单多次提交的一种方法。在实际应用中可能需要从多方面加以改进,例如:
  ⑴ 在登记表单ID之前检查用户输入数据的合法性,使得数据不合法时用户可以按“后退”按钮返回,在修正后再次提交同一表单。
  ⑵ 这种同一表单多次提交的限制最多只能在当前会话期间有效。如果要求这种限制能够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数据了。
  ⑶ 这种方法是不安全的。它仅用于防范误操作,不能防止熟练用户有意地同一表单多次提交;
还有一种只需使用几行代码的方法,轻松地实现了防止用户同一表单多次提交和使用后退钮重复多次提交表单。

表单文件formtest.asp
Randomize '初始代随机数种子
num1=rnd() '产生随机数num1
  num1=int(26*num1)+65 '修改num1的范围以使其是A-Z范围的Ascii码,以防表单名出错
  session("antry")="test"&chr(num1) '产生随机字符串

你的名字: '注意本行中使用了随机表单项名


表单处理程序testact.asp

teststr=request.form(session("antry"))
if teststr="" then
response.write "没有填写姓名或重复提交"
'由于用户没有填写名字,或表单被重复提交(标志为session("antry")为空)引起
else
response.write teststr
session("antry")=""  '提交成功,清空session("antry"),以防同一表单多次提交!
end if

在这里,你只需随机化一个必填项目的表单项名即可,不必随机化所有的表单项目。达到了限制同一表单多次提交的问题
相关文章
首页 电话 案例 关于