限制同一表单多次提交的分析
同一表单多次提交有时候会产生某些预料不到的结果,比如重复订阅邮件或重复 投票等。
本文介绍在ASP应用中防止用户在当前会话期间限制同一表单 多次提交简单方法。它主要由四个子程序组成,在较为简单的应用场合,你只要 将这些代码放在包含文件中直接引用即可; 一、基本工作过程下面我们依次讨论限制同一表单多次提交的四个子程序(一)初始化这里我们要在Session对象中保存两个变量,其中:⑴ 每一个表 单对应一个称为FID的唯一标识,为使该值唯一要用到一个计数器。⑵ 每当一个表单成功提交,必须在一个Dictionary对象中存储它的FID。我们用一个专用的过程来初始化上述数据。虽然以后各个子程序都要调用它,但 实际上每一个会话期间它只执行一次:Sub InitializeFID()If Not IsObject(Session("FIDList")) ThenSet Session("FIDList") =Server.CreateObject("Scripting.Dictionary")Session("FID")=0End IfEnd Sub(二)生成表单的唯一标识符
下面这个函数GenerateFID()用于生成表单的唯一标志。该函数首先将FID值加1 ,然后返回它:Function GenerateFID()InitializeFIDSession("FID") = Session("FID") + 1GenerateFID = Session ("FID")End Function(三)登记已提交表单
当表 单成功地提交时,在Dictionary对象中登记它的唯一标识:Sub RegisterFID()Dim strFIDInitializeFIDstrFID = Request ("FID")Session("FIDlist").Add strFID, now()End Sub(四)检查表单是否重复提交
在正式处理用户提交的表单之前, 应该在Dictionary对象中检查它的FID是否已经登记。下面的CheckFID()函数用 来完成这个工作,如已经登记,它返回FALSE,否则返回TRUE:Function CheckFID()Dim strFIDInitializeFIDstrFID = Request ("FID")CheckFID = not Session("FIDlist").Exists(strFID)End Function二、如何使用
有两个地方要用到上述函数,即 表单生成时与结果处理时。假设上述四个子程序已经放入包含文件Forms.inc中 ,下面的代码根据FID值来决定生成表单还是处理表单结果,它所描述的处理过 程适合于大多数ASP应用:Option ExplicitIf Request("FID") = "" Then
GenerateFormElseProcessFormEnd IfGenerateForm负责生成表 单,表单中应该含有一个隐藏的FID,如:
Sub GenerateForm()End SubProcessForm负责处理通过表单提交的内容,但在处理之前应该先调用 CheckFID()检查当前表单是否已经提交,代码类如:Sub ProcessForm()
If CheckFID() ThenResponse.Write "你输入的内容 是"Request.QueryString("param1")RegisterFIDElseResponse.Write "此表单只能提交一次!"End IfEnd Sub三、同一表单多次提交的限制与改进措施
上面我们介绍了在当前 会话期间限制同一表单多次提交的一种方法。在实际应用中可能需要从多方面加 以改进,例如: ⑴ 在登记表单ID之前检查用户输入数据的合法性,使 得数据不合法时用户可以按“后退”按钮返回,在修正后再次提交同一表单。 ⑵ 这种同一表单多次提交的限制最多只能在当前会话期间有效。如果 要求这种限制能够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数 据了。 ⑶ 这种方法是不安全的。它仅用于防范误操作,不能防止熟练 用户有意地同一表单多次提交;还有一种只需使用几行代码的方法,轻松地 实现了防止用户同一表单多次提交和使用后退钮重复多次提交表单。表单文件formtest.asp
Randomize '初始代随机数种子num1=rnd() '产 生随机数num1num1=int(26*num1)+65 '修改num1的范围以使其是A-Z范 围的Ascii码,以防表单名出错session("antry")="test"&chr(num1) '产生随机字符串你的名字: '注意本行中使用了随机表单项名
表单处理程序 testact.asp
teststr=request.form(session("antry"))
if teststr="" thenresponse.write "没有填写姓名或重复提交"'由于用 户没有填写名字,或表单被重复提交(标志为session("antry")为空)引起elseresponse.write teststrsession("antry")="" '提交成功 ,清空session("antry"),以防同一表单多次提交!end if在这里 ,你只需随机化一个必填项目的表单项名即可,不必随机化所有的表单项目。达 到了限制同一表单多次提交的问题
相关阅读
-
win10怎么快速关闭屏幕?win10快速关闭屏幕方法
估计很多用 Win10 的人都会想要快速锁屏来保护个人隐私,但是也有人不知道怎么快速关掉屏幕。其实很简单,你可以直接按 Win + L 快捷键,或者右键点击桌面上的空白地方,然后选择快捷方式就可以啦。下面我们就来详细说一下 Win10 快速
-
苹果iOS 17.4 Beta版开放侧载功能,但iPad不在列
1月27日消息,苹果公司近日针对欧盟《数字市场法》作出了响应,上线了iOS 17.4 Beta版,向欧盟用户开放了侧载功能。然而,尽管iPadOS与iOS在本质上并无太大差异,但iPad并不支持侧载功能。这意味着,安装第三方应用商店以及从第
-
极氪20万台新能源汽车里程碑达成
1月8日消息,国内新能源汽车市场再传捷报。极氪汽车今日欣喜公布,经过26个月的不懈努力,其累计交付汽车数量已突破20万台大关。这一成就不仅彰显了极氪在新能源领域的强劲实力,更使其持续刷新着新势力品牌的最快交付纪录,同时保持着全球唯一的新能源
-
Win11系统intel核显控制面板怎么打开-打开intel核显控制面板的方法
你晓得吗?有些小伙伴想开自己电脑的intel核显控制面板来看显卡驱动信息。里面可以检查更新驱动。但是,他们不知道怎么开这个面板。如果也想试试看的话,可以看看下面的操作方法哦!打开intel核显控制面板的方法1. 右键桌面空白处,就能打开英特
-
Windows10玩GTA5闪退怎么解决?Windows10玩GTA5闪退解决方法
Windows10玩GTA5闪退怎么解决?GTA5是一款非常知名的游戏,很多的玩家都在畅玩,但是很多的用户们在玩耍这一款游戏的时候,遇到了自己电脑玩GTA5会闪退,这个问题我们怎么解决呢?下面小编为大家带来详细的解决方法介绍,快来看看吧!
-
极氪第二款MPV车型“CM2E”谍照曝光,或于2024年上半年亮相
1月17日消息,近日,知名汽车博主@SugarDesign在社交媒体上发布了极氪品牌旗下第二款MPV车型——内部代号“CM2E”的谍照。据推测,新车可能为小型MPV,有望于2024年上半年与大家正式见面。 从曝光的谍照中可以看出,极氪CM