在ASP中限制同一表单被多次提交

本文介绍了一种在ASP应用中防止用户在同一会话期内多次提交相同表单的方法。通过生成唯一标识符并利用Session对象进行跟踪,确保表单只被处理一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍在ASP应用中防止用户在当前会话期间多次提交同一表单的一个简单方法。它主要由四个子程序组成,在较为简单的应用场合,你只要将这些代码放在包含文件中直接引用即可;对于那些较为复杂的环境,我们在文章的最后给出一些改进建议。

  一、基本工作过程

  下面我们依次讨论这四个子程序。

 (一)初始化

  这里我们要在Session对象中保存两个变量,其中:

  ⑴每一个表单对应一个称为FID的唯一标识,为使该值唯一要用到一个计数器。

  ⑵每当一个表单成功提交,必须在一个Dictionary对象中存储它的FID。

  我们用一个专用的过程来初始化上述数据。虽然以后各个子程序都要调用它,但实际上每一个会话期间它只执行一次:

SubInitializeFID()
IfNotIsObject(Session("FIDList"))Then
SetSession("FIDList")=Server.CreateObject("Scripting.Dictionary")
Session("FID")=0
EndIf
EndSub




  (二)生成表单的唯一标识符

  下面这个函数GenerateFID()用于生成表单的唯一标志。该函数首先将FID值加1,然后返回它:



FunctionGenerateFID()
InitializeFID
Session("FID")=Session("FID")+1
GenerateFID=Session("FID")
EndFunction




  (三)登记已提交表单

  当表单成功地提交时,在Dictionary对象中登记它的唯一标识:



SubRegisterFID()
DimstrFID
InitializeFID
strFID=Request("FID")
Session("FIDlist").AddstrFID,now()
EndSub



  (四)检查表单是否重复提交

  在正式处理用户提交的表单之前,应该在Dictionary对象中检查它的FID是否已经登记。下面的CheckFID()函数用来完成这个工作,如已经登记,它返回FALSE,否则返回TRUE:

FunctionCheckFID()
DimstrFID
InitializeFID
strFID=Request("FID")
CheckFID=notSession("FIDlist").Exists(strFID)
EndFunction


  二、如何使用

  有两个地方要用到上述函数,即表单生成时与结果处理时。假设上述四个子程序已经放入包含文件Forms.inc中,下面的代码根据FID值来决定生成表单还是处理表单结果,它所描述的处理过程适合于大多数ASP应用:



<%OptionExplicit%>
<!--#includefile="forms.inc"-->
<HTML>
<HEAD>
<TITLE>表单提交测试</TITLE>
</HEAD
<BODY>
<%
IfRequest("FID")=""Then
GenerateForm
Else
ProcessForm
EndIf
%>
</BODY>
</HTML>



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

<%
SubGenerateForm()
%>
<formaction="<%=Request.ServerVariables("PATH_INFO")%>"method=GET>
<inputtype=hiddenname=FIDvalue="<%=GenerateFID()%>">
<inputtype=textname="param1"value="">
<inputtype=submitvalue="OK">
</form>
<%
EndSub
%>


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


<%
SubProcessForm()
IfCheckFID()Then
Response.Write"你输入的内容是"&Request.QueryString("param1")
RegisterFID
Else
Response.Write"此表单只能提交一次!"
EndIf
EndSub
%>



  三、限制与改进措施

  上面我们介绍了在当前会话期间限制同一表单被多次提交的一种方法。在实际应用中可能需要从多方面加以改进,例如:

  ⑴在登记表单ID之前检查用户输入数据的合法性,使得数据不合法时用户可以按“后退”按钮返回,在修正后再次提交同一表单。

  ⑵这种对表单提交的限制最多只能在当前会话期间有效。如果要求这种限制能够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数据了。

  ⑶这种方法是不安全的。它仅用于防范误操作,不能防止熟练用户有意地多次提交同一表单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值