iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >高级表单验证-针对多次提交表单(转)
  • 415
分享到

高级表单验证-针对多次提交表单(转)

2023-06-03 06:06:34 415人浏览 泡泡鱼
摘要

每个开发人员面对的困难是预测用户能够或是将要做什么--这对于网络开发人员来说就更为困 难,因为他的预测必须考虑到WEB 的多样性和缺乏真正的session控制机制。如果你已经创建过一个使用表单的ASP应用程序,也许你已经遇到过一些奇怪的问题

每个开发人员面对的困难是预测用户能够或是将要做什么--这对于网络开发人员来说就更为困 难,因为他的预测必须考虑到WEB 的多样性和缺乏真正的session控制机制。如果你已经创建过一个使用表单的ASP应用程序,也许你已经遇到过一些奇怪的问题,如数据传输两次,接收数据不完整,或者用户报告表单显示不正确。尽管你也插入了确认数据所需的所有客户机端和服务器端的脚本,表单仍然会发生许多异常情况。这些异常情况与意外用户行为或浏览器书签的误使用有关。本文将集中解决一些容易引起表单问题的典型情况:用户意外地重复发送数据,在多步骤表单中直接使用中间表单。

数据复制

  通过表单重复发送数据是一个常见的情况,但是它会带来问题。在理想的情况下,用户在一个 Web 站点遇到一个表单,用正确的数据类型填充它,将它提交给处理数据的服务器,然后作为回应发送给用户一个确认页,这时用户就可以再去做别的。如果用户重新访问前面那一页,使用back 按钮,然后无意中再将数据发送一次,那将会出现什么情形呢?如果你没有预料到这一场景并且有所准备,数据就将被重新传送给服务器并且再处理一次。试想这些数据是一份订单或旅馆预约,那将会带来很不愉快的结果。

终止重复数据传输

  为了避免那些错误地重复发送给服务器的数据,可以在服务器侧进行一些校验,来确定用户能 意识到他们正在发送数据。这里使用的例子包含一个有单一文本框的简单表单,表单接收一些文本,然后将其发送到一个显示它们的ASP页。 为确保用户不将同样的信息发送两次,需要指示数据已经被服务器接收到。存储这些信息的最好的地方是一个session变量。定义一个session变量Session("submitted") ,当用户第一次到达这个表单时将它初始化为False,在用户进行最初的数据传输时将它设置为true 。如果用户在当前的session期间重新访问这个表单,将出现相关重复提交信息。
所以用户只能是在有意的情况下向服务器重复发送数据。现在来看看执行这一校验的代码。建立表单并且校验已发送数据的ASP页(在下载处为fORM.asp)有以下结构:
html
〈 HEAD 〉
〈 /HEAD 〉
〈 BODY 〉
〈 % If Session("submitted") Then % 〉
〈 !-- Code showing the warning message -- 〉
... 〈 % Else % 〉
〈 !-- Code showing the form -- 〉
... 〈 % End If % 〉
〈 /BODY 〉
〈 /HTML 〉

  表单和警告信息都是从同一个ASP页创建的。表单包括标准的HTML代码,引用ManageForm.asp页作为它的ACTION 属性:

〈 FORM METHOD="post" ACTION="ManageForm.asp" 〉
Send me some data:
〈 INPUT TYPE="text" NAME="data" 〉
〈 P 〉
〈 INPUT TYPE="submit" VALUE="Submit" 〉
〈 INPUT TYPE="reset" VALUE="Cancel" 〉
〈 /FORM 〉

ManageForm.asp 页接收用户发送的文本,显示它并将session 变量submitted设置为True:
〈 HTML 〉
〈 HEAD 〉
〈 /HEAD 〉
〈 BODY 〉
You have sent the following information:
〈 P 〉
〈 %= Request("data") % 〉
〈 % Session("submitted") = True % 〉
〈 /BODY 〉
〈 /HTML 〉

  所以当用户又回到这个表单时,测试session 变量submitted,当它的值为True时,发送给用 户的是警告信息而不是输入表单。这个警告信息是用HTML和客户机侧的javascript代码组合编写的:
〈 script 〉
function SendAnswer(answer) { document.AnswerForm.answer.value = answer document.AnswerForm.submit() }
〈 /script 〉
You have already submitted some information to this Web site.
〈 BR 〉 Do you want submit again?
〈 P 〉
〈 FORM NAME="AnswerForm" METHOD="post" ACTION="CheckAnswer.asp" 〉
〈 INPUT TYPE="button" VALUE="Yes" onClick="SendAnswer('Y')" 〉
〈 INPUT TYPE="button" VALUE="No" onClick="SendAnswer('N')" 〉
〈 INPUT TYPE="hidden" NAME="answer" VALUE="" 〉
〈 /FORM 〉

  表单包含两个按钮((Yes 和 No) 以及一个隐含控制域(answer) ,在其中保存用户所选择的值: Y 或 N。这个值由Javascript 函数SendAnswer() 设置,这个函数还将它发送给CheckAnswer.asp 页以执行正确的重定向。如果用户选择了No按钮,CheckAnswer.asp 检验隐含控制的值,并将其重定向到一个普通 welcome 页,反之就将session 变量submitted设置为False 并再次将其重定向到表单页。
〈 % If Request("answer") = "Y" Then Session("submitted") = False Response.Redirect "form.asp" Else Response.Redirect "welcome.htm" End If % 〉

控制浏览器缓冲器

  如果你已经实施了以上方法,你会发现,只有当你在浏览器的地址文本框内键入URL来回到这个 表单时,此方法才奏效。它依靠的是浏览器的缓冲器机制。如果你使用back按钮来返回页,浏览器就检测它的缓冲器来找到该页的副本。它将使用缓存的页而不是向服务器发出请求。所以服务器就 不能在session 变量submitted上进行校验。为了避免这种情况,就要抑制浏览器的页缓冲器。这通过在表单页中处理Response对象来实现。取消页缓冲器有多种方法。所有这些方法都要依靠Http头文件中到浏览器的地址指示。但是所有浏览器对服务器发送的指示反应不同,所以说最好能多发送一些指示来为更多的浏览器抑制缓冲器,按以下代码所示:

〈 % Response.AddHeader "cache-control", "private" Response.AddHeader "pragma", "no-cache" Response.ExpiresAbsolute = #January 1, 1990 00:00:01# Response.Expires=0 % 〉

  以上代码的头两行使用Response 对象的AddHeader 方法来将头信息附加到HTTP头文件中。 Expires 和 ExpiresAbsolute 属性用浏览器缓冲器中页的持续时间信息来标记当前页。在表单页中,这些行必须要插入在所有代码之前,因为她们所引用的信息放置在HTTP头文件中,在所有输出之前发送给浏览器。

多步骤表单

  如果一个表单需要许多数据,那么最好将你要求的数据划分成多个小表单,这样使用户可以一步一步地填充表单,而不用等待表单加载许多HTML控制。另外还有一些情况,表单中的某些控制不完全必要,并且可以用已经提交的数据逐行填充。使用多步骤表单允许显示倚赖于用户以前答案的定制表单。如果用户在浏览器中将一个中间表单设置为书签的话就会产生问题。在随后的一个session中,用户就试图直接到达这个表单并提交数据,这些数据已经在上下文范围之外,因为本来应该在前面 表单收集的session 数据丢失了。

避免使用中间步骤表单

  为了避免这些问题,可以存储当前数据收集的状态。这个状态可以用一个session 变量来代表 来记录是否执行了一个特定的步骤---用户是否填充了给出的表单。在一个多步骤表单中,每个表单都可以通过一个Boolean型的session变量来实现。如果有关表单没有被处理,变量就为False ,反之就是True。下载部分的第二个例子显示一个两步骤表单:第一个表单要求用户名,第二个表单显示一个组合框,它的列表项要依赖第一个表单所提供的用户名。第一个表单与一个session变量requested1相关联,你可以想象出来,第二个表单与变量requested2相关联。当用户要求第一个表单(form1.asp) 时,session变量 requested1 被设置为 True :

〈 FORM METHOD="post" ACTION="form2.asp" 〉
Your name: 〈 INPUT TYPE="text" NAME="name" 〉
〈 P 〉
〈 INPUT TYPE="submit" VALUE="Submit" 〉
〈 INPUT TYPE="reset" VALUE="Cancel" 〉
〈 /FORM 〉
〈 % Session("requested1") = True % 〉

  这个值将由下一个表单( form2.asp ) 来校验,以确定是否满足了要求。事实上当用户要求第二个表单时校验requested1 变量。如果为True,就向浏览器发送第二个表单并将requested2变量设置为True。如果为False 就意味着用户想要直接使用第二个表单,于是浏览器就重定向到第一个表单。以下代码是第二个表单的ASP页:

〈 % If Session("requested1") Then % 〉
〈 HTML 〉
〈 HEAD 〉
〈 /HEAD 〉
〈 BODY 〉
〈 !-- Code for the second form -- 〉
... 〈 % Session("requested2") = True Else Response.Redirect "form1.asp" End If % 〉
〈 /BODY 〉
〈 /HTML 〉

  要注意对requested1 的校验必须要在〈 HTML 〉记录之前进行,这样就允许可能的重定向。实际上,重定向是对浏览器的指示,它出现在HTTP头文件中,在所有的HTML代码之前。

结论

  本文所示范的两种技巧允许ASP开发人员对某些奇怪的情况有所控制,这些奇怪情况会造成用户 通过一个Web 表单向服务器重复发送数据。每个技巧解决一个特定问题,所以最好将两者混合使用,在ASP应用程序每个表单中管理两个session 变量。[@more@]

--结束END--

本文标题: 高级表单验证-针对多次提交表单(转)

本文链接: https://www.lsjlt.com/news/233275.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 高级表单验证-针对多次提交表单(转)
    每个开发人员面对的困难是预测用户能够或是将要做什么--这对于网络开发人员来说就更为困 难,因为他的预测必须考虑到Web 的多样性和缺乏真正的session控制机制。如果你已经创建过一个使用表单的ASP应用程序,也许你已经遇到过一些奇怪的问题...
    99+
    2023-06-03
  • easyui如何验证ajax提交表单
    这篇文章主要介绍“easyui如何验证ajax提交表单”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“easyui如何验证ajax提交表单”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • Flex如何实现表单提交验证
    这篇文章给大家分享的是有关Flex如何实现表单提交验证的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex表单提交验证一、定义Flex表单提交验证条件,如:source为要绑定的文本框,trigger为绑定提交...
    99+
    2023-06-17
  • golang 提交表单 跳转
    在Golang中提交表单并跳转是一项常见的任务。表单的提交可以用于许多不同的用例,例如用户注册,搜索,添加或更新数据等。在这篇文章中,我们将探讨如何编写一个基本的表单提交程序,以及如何处理跳转。实现表单提交首先,我们需要一个简单的HTML表...
    99+
    2023-05-14
  • VUE 表单验证进阶指南:将表单提升至新高度
    1. 使用 VUE 内置的表单验证库 VUE 提供了一个内置的表单验证库,您可以使用它来轻松验证表单数据。要使用此库,您需要在您的 VUE 项目中安装 vee-validate 包。安装完成后,您可以在您的组件中使用 vee-valid...
    99+
    2024-02-24
    VUE 表单验证 自定义验证 错误处理 表单提交
  • JS中表单提交验证的示例分析
    这篇文章将为大家详细讲解有关JS中表单提交验证的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在进行表单提交时,需要对输入框和文本域等的value的合理性进行验证...
    99+
    2024-04-02
  • springboot表单提交之validator校验
    前言 表单提交是最常见的数据提交方式,我们经常会填写表单信息,比如用户名,身份证,手机号等等,因此就会产生身份证是否合法,用户名是否为空,虽然我们可以直接在前台使用js就进行格式的校...
    99+
    2024-04-02
  • Vue3 + elementplus实现表单验证+上传图片+ 防止表单重复提交功能
    首先,上官网地址 https://element.eleme.cn/ 首先页面上面用了弹窗的形式,做完之后长这样,有全屏,关闭等按钮,上效果图和完整代码!!!!! <!--点...
    99+
    2022-11-13
    Vue3  elementplus表单验证 Vue3  elementplus防止表单重复提交 Vue3  elementplus上传图片
  • jQuery中Validate如何提交表单验证失败扩展
    这篇文章主要为大家展示了“jQuery中Validate如何提交表单验证失败扩展”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery中Validate如何...
    99+
    2024-04-02
  • JavaScript表单验证不成功不能提交怎么办
    小编给大家分享一下JavaScript表单验证不成功不能提交怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、基本目标一个...
    99+
    2024-04-02
  • 微信小程序实现表单验证提交功能
    本文实例为大家分享了微信小程序实现表单验证提交的具体代码,供大家参考,具体内容如下 效果图: 说明:点击一键预约提交表单时我们需要验证一些必填项以及它们的格式。微信小程序表单验证跟...
    99+
    2024-04-02
  • ajax提交url与ajax提交表单的对比
    这篇文章主要介绍“ajax提交url与ajax提交表单的对比”,在日常操作中,相信很多人在ajax提交url与ajax提交表单的对比问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • jQuery中Validator如何验证Ajax提交表单和Ajax传参
    这篇文章将为大家详细讲解有关jQuery中Validator如何验证Ajax提交表单和Ajax传参,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。serialize() 方...
    99+
    2024-04-02
  • 如何优化PHP开发中的表单提交和验证
    在PHP开发中,表单提交和验证是非常常见的需求。优化表单提交和验证的过程可以提高用户体验,并增加系统的安全性。下面将介绍一些具体的优化技巧和代码示例,帮助开发者更好地处理表单提交和验证。合理使用POST方法在表单提交中,使用POST方法可以...
    99+
    2023-10-21
    表单提交:submit 表单验证:validation 优化:optimization
  • Vue清除Form表单校验信息的解决方法(清除表单验证上次提示信息)
    目录问题描述解决办法1.使用Iview中的Form组件:清除表单的验证提示信息与字段值2.使用Element Ui中的Form组件2.1 只清除表单验证提示信息,不清除字段值2.2 ...
    99+
    2023-05-15
    Vue 清除Form表单校验信息 Vue 清除表单校验
  • 原生js实现表单的正则验证(验证通过后才可提交)
    实现了如下功能: 1.用户名:onfouc显示msg规则;onkeyup计算字符,其中中文为两个字符;onblur,验证是否通过 2.邮箱:onblur 正则匹配,正则是根据自己的...
    99+
    2024-04-02
  • yii中form表单提交之前JS如何在提交按钮上进行验证
    这篇文章主要介绍yii中form表单提交之前JS如何在提交按钮上进行验证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 很多时候,需要对Yii表单model中的对象设置的r...
    99+
    2024-04-02
  • element表单验证如何清除校验提示语
    目录问题场景:解决方案:1. 对字段进行单独校验2. 直接清除表单域下该字段的提示信息问题场景: 最近在进行项目开发的时候,遇到了这样的一个问题: 对表单域中的数据进行校验的时候,其...
    99+
    2024-04-02
  • php实现提交表单后跳转页面
    对于使用PHP来处理表单的网站而言,表单提交后跳转页面是一项非常常见的功能。本文将会详细地介绍如何通过PHP来实现表单提交后跳转到指定页面。为了实现表单提交后跳转页面,我们需要按照以下步骤进行操作:定义HTML表单首先,我们需要在HTML中...
    99+
    2023-05-24
  • 用javascript响应表单的提交事件(转)
    我们有的时候要在提交表单之前对用户输入的数据进行验证,如果输入的不正确的话,就给一提示,并让从新输入,那么我们是怎么实现的呢现在我以一个需求的实现为例进行简要说明:我的功能要求:用户输入一个类型,要求是数字,所以我们进行数字验证。在提交的时...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作