通过表单重复发送数据是一个常见的情况,但是它会带来问题。在理想的情况下,用户在一个 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 〉
〈 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 % 〉
〈 % 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代码之前。