限制(禁止)重复提交同一表单
限制重复提交同一表单,禁止重复提交同一表单,防止重复提交表单
我们在网页中经常会看到一些投票方面的功能,就是我们对某一项投票过后一般就不会再让我们投了,这就是因为限制了重复提交同一表单。在互联网上也发现很多缺乏这种限制,所以在这里就提供一种防止用户在当前会话期间多次提交同一表单的方法;
1.基本工作过程
下面我们依次讨论这4个子程序。
⑴初始化
这里我们要在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对象中登记它的FID.
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
2.如何使用
有两个地方要用到上述函数,即表单生成时与结果处理时。先把上述4个子程序放入好汉文件Forms.inc中,下面的代码根据FID值来决定生成表单还是处理表单结果,它说描述的处理过程适合于大多数ASP应用。
<%
'**************************************
'文件名:subform.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"你输入的内容是" & Request.QueryString("paraml")
ReGISterFID
Else
Response.Write"此表单只能提交一次!"
End If
End Sub
%>
3.限制与改进措施
前面我们介绍了在当前会话期间限制同一表单被多次提交的一种方法。在实际应用中可能需要从多方面加以改进。
⑴在登记表单ID之前检查用户输入数据的合法性,使用数据不合法的用户可以单击"后退"按钮返回,在修正后再次提交同一表单;
⑵这种对表单提交的限制最多只能在当前会话期间有效,如果要求这种限制鞥够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数据了。