欢迎来到天天文库
浏览记录
ID:42406726
大小:30.00 KB
页数:4页
时间:2019-09-14
《高级表单验证-针对多次提交表单》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、每个开发人员面对的困难是预测用户能够或是将要做什么--这对于网络开发人员来说就更为困难,因为他的预测必须考虑到Web的多样性和缺乏真正的session控制机制。如果你已经创建过一个使用表单的ASP应用程序,也许你已经遇到过一些奇怪的问题,如数据传输两次,接收数据不完整,或者用户报告表单显示不正确。尽管你也插入了确认数据所需的所有客户机端和服务器端的脚本,表单仍然会发生许多异常情况。这些异常情况与意外用户行为或浏览器书签的误使用有关。本文将集中解决一些容易引起表单问题的典型情况:用户意外地重复发送数据,在多步骤
2、表单中直接使用中间表单。数据复制 通过表单重复发送数据是一个常见的情况,但是它会带来问题。在理想的情况下,用户在一个Web站点遇到一个表单,用正确的数据类型填充它,将它提交给处理数据的服务器,然后作为回应发送给用户一个确认页,这时用户就可以再去做别的。如果用户重新访问前面那一页,使用back按钮,然后无意中再将数据发送一次,那将会出现什么情形呢?如果你没有预料到这一场景并且有所准备,数据就将被重新传送给服务器并且再处理一次。试想这些数据是一份订单或旅馆预约,那将会带来很不愉快的结果。终止重复数据传输 为了
3、避免那些错误地重复发送给服务器的数据,可以在服务器侧进行一些校验,来确定用户能意识到他们正在发送数据。这里使用的例子包含一个有单一文本框的简单表单,表单接收一些文本,然后将其发送到一个显示它们的ASP页。为确保用户不将同样的信息发送两次,需要指示数据已经被服务器接收到。存储这些信息的最好的地方是一个session变量。定义一个session变量Session("submitted"),当用户第一次到达这个表单时将它初始化为False,在用户进行最初的数据传输时将它设置为true。如果用户在当前的session
4、期间重新访问这个表单,将出现相关重复提交信息。所以用户只能是在有意的情况下向服务器重复发送数据。现在来看看执行这一校验的代码。建立表单并且校验已发送数据的ASP页(在下载处为form.asp)有以下结构:〈HTML〉〈HEAD〉〈/HEAD〉〈BODY〉〈%IfSession("submitted")Then%〉〈!--Codeshowingthewarningmessage--〉...〈%Else%〉〈!--Codeshowingtheform--〉...〈%EndIf%〉〈/BODY〉〈/HTML〉 表
5、单和警告信息都是从同一个ASP页创建的。表单包括标准的HTML代码,引用ManageForm.asp页作为它的ACTION属性:〈FORMMETHOD="post"ACTION="ManageForm.asp"〉Sendmesomedata:〈INPUTTYPE="text"NAME="data"〉〈P〉〈INPUTTYPE="submit"VALUE="Submit"〉〈INPUTTYPE="reset"VALUE="Cancel"〉〈/FORM〉ManageForm.asp页接收用户发送的文本,显示它并将
6、session变量submitted设置为True:〈HTML〉〈HEAD〉〈/HEAD〉〈BODY〉Youhavesentthefollowinginformation:〈P〉〈%=Request("data")%〉〈%Session("submitted")=True%〉〈/BODY〉〈/HTML〉 所以当用户又回到这个表单时,测试session变量submitted,当它的值为True时,发送给用户的是警告信息而不是输入表单。这个警告信息是用HTML和客户机侧的JavaScript代码组合编写的:〈S
7、CRIPT〉functionSendAnswer(answer){document.AnswerForm.answer.value=answerdocument.AnswerForm.submit()}〈/SCRIPT〉YouhavealreadysubmittedsomeinformationtothisWebsite.〈BR〉Doyouwantsubmitagain?〈P〉〈FORMNAME="AnswerForm"METHOD="post"ACTION="CheckAnswer.asp"〉〈INPUTT
8、YPE="button"VALUE="Yes"onClick="SendAnswer('Y')"〉〈INPUTTYPE="button"VALUE="No"onClick="SendAnswer('N')"〉〈INPUTTYPE="hidden"NAME="answer"VALUE=""〉〈/FORM〉 表单包含两个按钮((Yes和No)以及一个隐含控制域(answer),在其中保存用户所选择的值
此文档下载收益归作者所有