铿鸟百科网

当前位置:主页 > 百科 > 电脑百科 >

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

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

时间:2025-07-06 来源:铿鸟百科网 收集整理:小编 阅读:
导读:同一表单多次提交有时候会产生某些预料不到的结果,比如重复订阅邮件或重复 投票等。本文介绍在ASP应用中防止用户在当前会话期间限制同一表单 多次提交简单方法。它主要由四个子程序组成,在较为简单的应用场合,你只要 将这些代码放在包含文件中直接引

同一表单多次提交有时候会产生某些预料不到的结果,比如重复订阅邮件或重复 投票等。

本文介绍在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

在这里 ,你只需随机化一个必填项目的表单项名即可,不必随机化所有的表单项目。达 到了限制同一表单多次提交的问题

相关阅读

  • win10怎么快速关闭屏幕?win10快速关闭屏幕方法

    win10怎么快速关闭屏幕?win10快速关闭屏幕方法

    估计很多用 Win10 的人都会想要快速锁屏来保护个人隐私,但是也有人不知道怎么快速关掉屏幕。其实很简单,你可以直接按 Win + L 快捷键,或者右键点击桌面上的空白地方,然后选择快捷方式就可以啦。下面我们就来详细说一下 Win10 快速

  • 苹果iOS 17.4 Beta版开放侧载功能,但iPad不在列

    苹果iOS 17.4 Beta版开放侧载功能,但iPad不在列

    1月27日消息,苹果公司近日针对欧盟《数字市场法》作出了响应,上线了iOS 17.4 Beta版,向欧盟用户开放了侧载功能。然而,尽管iPadOS与iOS在本质上并无太大差异,但iPad并不支持侧载功能。这意味着,安装第三方应用商店以及从第

  • 极氪20万台新能源汽车里程碑达成

    极氪20万台新能源汽车里程碑达成

    1月8日消息,国内新能源汽车市场再传捷报。极氪汽车今日欣喜公布,经过26个月的不懈努力,其累计交付汽车数量已突破20万台大关。这一成就不仅彰显了极氪在新能源领域的强劲实力,更使其持续刷新着新势力品牌的最快交付纪录,同时保持着全球唯一的新能源

  • Win11系统intel核显控制面板怎么打开-打开intel核显控制面板的方法

    Win11系统intel核显控制面板怎么打开-打开intel核显控制面板的方法

    你晓得吗?有些小伙伴想开自己电脑的intel核显控制面板来看显卡驱动信息。里面可以检查更新驱动。但是,他们不知道怎么开这个面板。如果也想试试看的话,可以看看下面的操作方法哦!打开intel核显控制面板的方法1. 右键桌面空白处,就能打开英特

  • Windows10玩GTA5闪退怎么解决?Windows10玩GTA5闪退解决方法

    Windows10玩GTA5闪退怎么解决?Windows10玩GTA5闪退解决方法

    Windows10玩GTA5闪退怎么解决?GTA5是一款非常知名的游戏,很多的玩家都在畅玩,但是很多的用户们在玩耍这一款游戏的时候,遇到了自己电脑玩GTA5会闪退,这个问题我们怎么解决呢?下面小编为大家带来详细的解决方法介绍,快来看看吧!

  • 极氪第二款MPV车型“CM2E”谍照曝光,或于2024年上半年亮相

    极氪第二款MPV车型“CM2E”谍照曝光,或于2024年上半年亮相

    1月17日消息,近日,知名汽车博主@SugarDesign在社交媒体上发布了极氪品牌旗下第二款MPV车型——内部代号“CM2E”的谍照。据推测,新车可能为小型MPV,有望于2024年上半年与大家正式见面。  从曝光的谍照中可以看出,极氪CM