資源描述:
《高級(jí)表單驗(yàn)證-針對(duì)多次提交表單》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、每個(gè)開(kāi)發(fā)人員面對(duì)的困難是預(yù)測(cè)用戶能夠或是將要做什么--這對(duì)于網(wǎng)絡(luò)開(kāi)發(fā)人員來(lái)說(shuō)就更為困難,因?yàn)樗念A(yù)測(cè)必須考慮到Web的多樣性和缺乏真正的session控制機(jī)制。如果你已經(jīng)創(chuàng)建過(guò)一個(gè)使用表單的ASP應(yīng)用程序,也許你已經(jīng)遇到過(guò)一些奇怪的問(wèn)題,如數(shù)據(jù)傳輸兩次,接收數(shù)據(jù)不完整,或者用戶報(bào)告表單顯示不正確。盡管你也插入了確認(rèn)數(shù)據(jù)所需的所有客戶機(jī)端和服務(wù)器端的腳本,表單仍然會(huì)發(fā)生許多異常情況。這些異常情況與意外用戶行為或?yàn)g覽器書(shū)簽的誤使用有關(guān)。本文將集中解決一些容易引起表單問(wèn)題的典型情況:用戶意外地重復(fù)發(fā)送數(shù)據(jù),在多步驟
2、表單中直接使用中間表單。數(shù)據(jù)復(fù)制 通過(guò)表單重復(fù)發(fā)送數(shù)據(jù)是一個(gè)常見(jiàn)的情況,但是它會(huì)帶來(lái)問(wèn)題。在理想的情況下,用戶在一個(gè)Web站點(diǎn)遇到一個(gè)表單,用正確的數(shù)據(jù)類型填充它,將它提交給處理數(shù)據(jù)的服務(wù)器,然后作為回應(yīng)發(fā)送給用戶一個(gè)確認(rèn)頁(yè),這時(shí)用戶就可以再去做別的。如果用戶重新訪問(wèn)前面那一頁(yè),使用back按鈕,然后無(wú)意中再將數(shù)據(jù)發(fā)送一次,那將會(huì)出現(xiàn)什么情形呢?如果你沒(méi)有預(yù)料到這一場(chǎng)景并且有所準(zhǔn)備,數(shù)據(jù)就將被重新傳送給服務(wù)器并且再處理一次。試想這些數(shù)據(jù)是一份訂單或旅館預(yù)約,那將會(huì)帶來(lái)很不愉快的結(jié)果。終止重復(fù)數(shù)據(jù)傳輸 為了
3、避免那些錯(cuò)誤地重復(fù)發(fā)送給服務(wù)器的數(shù)據(jù),可以在服務(wù)器側(cè)進(jìn)行一些校驗(yàn),來(lái)確定用戶能意識(shí)到他們正在發(fā)送數(shù)據(jù)。這里使用的例子包含一個(gè)有單一文本框的簡(jiǎn)單表單,表單接收一些文本,然后將其發(fā)送到一個(gè)顯示它們的ASP頁(yè)。為確保用戶不將同樣的信息發(fā)送兩次,需要指示數(shù)據(jù)已經(jīng)被服務(wù)器接收到。存儲(chǔ)這些信息的最好的地方是一個(gè)session變量。定義一個(gè)session變量Session("submitted"),當(dāng)用戶第一次到達(dá)這個(gè)表單時(shí)將它初始化為False,在用戶進(jìn)行最初的數(shù)據(jù)傳輸時(shí)將它設(shè)置為true。如果用戶在當(dāng)前的session
4、期間重新訪問(wèn)這個(gè)表單,將出現(xiàn)相關(guān)重復(fù)提交信息。所以用戶只能是在有意的情況下向服務(wù)器重復(fù)發(fā)送數(shù)據(jù)?,F(xiàn)在來(lái)看看執(zhí)行這一校驗(yàn)的代碼。建立表單并且校驗(yàn)已發(fā)送數(shù)據(jù)的ASP頁(yè)(在下載處為form.asp)有以下結(jié)構(gòu):〈HTML〉〈HEAD〉〈/HEAD〉〈BODY〉〈%IfSession("submitted")Then%〉〈!--Codeshowingthewarningmessage--〉...〈%Else%〉〈!--Codeshowingtheform--〉...〈%EndIf%〉〈/BODY〉〈/HTML〉 表
5、單和警告信息都是從同一個(gè)ASP頁(yè)創(chuàng)建的。表單包括標(biāo)準(zhǔn)的HTML代碼,引用ManageForm.asp頁(yè)作為它的ACTION屬性:〈FORMMETHOD="post"ACTION="ManageForm.asp"〉Sendmesomedata:〈INPUTTYPE="text"NAME="data"〉〈P〉〈INPUTTYPE="submit"VALUE="Submit"〉〈INPUTTYPE="reset"VALUE="Cancel"〉〈/FORM〉ManageForm.asp頁(yè)接收用戶發(fā)送的文本,顯示它并將
6、session變量submitted設(shè)置為T(mén)rue:〈HTML〉〈HEAD〉〈/HEAD〉〈BODY〉Youhavesentthefollowinginformation:〈P〉〈%=Request("data")%〉〈%Session("submitted")=True%〉〈/BODY〉〈/HTML〉 所以當(dāng)用戶又回到這個(gè)表單時(shí),測(cè)試session變量submitted,當(dāng)它的值為T(mén)rue時(shí),發(fā)送給用戶的是警告信息而不是輸入表單。這個(gè)警告信息是用HTML和客戶機(jī)側(cè)的JavaScript代碼組合編寫(xiě)的:〈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〉 表單包含兩個(gè)按鈕((Yes和No)以及一個(gè)隱含控制域(answer),在其中保存用戶所選擇的值