ASP中JavaScript處理復(fù)雜表單的生成與驗(yàn)證
作為改進(jìn)措施,可以在表Definitions、Lists和Records中增加一個(gè)字段FormID。FormID唯一標(biāo)識(shí)一個(gè)表單,這樣程序就可以同時(shí)地定義多個(gè)表單、保存多個(gè)表單的用戶(hù)應(yīng)答結(jié)果。至于上面的sTitleLabel,我們可以用另外一個(gè)表(比如Forms)來(lái)保存。
緊接著表格標(biāo)記和表格標(biāo)題,程序輸出的是HTML表單以及“提交”、“清除”按鈕的代碼。在此之后,程序檢查sHTML字符串中是否包含“*”,如包含的話(huà)說(shuō)明表單中存在必須輸入的內(nèi)容,此時(shí)就輸出一個(gè)腳注以說(shuō)明該星號(hào)的含義。
以下是引用片段:
< %=sHTML% >
< TR >
< TD COLSPAN="2" ALIGN="CENTER" >
< INPUT TYPE="SUBMIT" VALUE="提交表單" > < INPUT TYPE="reset" VALUE="清除" >
< /TD >
< %
'是否存在必需輸入的表單域,如存在,則輸出表單腳注解釋'*'的含義
If InStr(sHTML,"*") Then
% >
< /TR >
< TD COLSPAN="2" ALIGN="CENTER" >
< FONT SIZE="2" >注意:有星號(hào)標(biāo)記的值必需輸入。< /FONT >
< /TD >
< /TR >
< %
End If
% >
< /TABLE >
< /FORM >
至此為止,表單的生成任務(wù)已經(jīng)完成。
四、處理提交結(jié)果
ASP腳本剩下的任務(wù)是服務(wù)器端的表單處理,包括驗(yàn)證、將結(jié)果保存到數(shù)據(jù)庫(kù)以及“提交成功/失敗”頁(yè)面的顯示。在這部分表單驗(yàn)證代碼中用到了一個(gè)字符串變量sBadForm,程序用它來(lái)保存錯(cuò)誤信息。如果在驗(yàn)證過(guò)程結(jié)束時(shí)sBadForm為空,說(shuō)明用戶(hù)提交的表單是合法的;否則,拒絕該表單的提交并把sBadForm返回給瀏覽器。
不管表單采用哪種驗(yàn)證模式,檢查HTTP_REFERER都是一種好的習(xí)慣。這種檢查可以防止腳本被盜用。要檢查某個(gè)POST是否來(lái)自本網(wǎng)站的頁(yè)面或腳本,只需比較兩個(gè)服務(wù)器變量即可:
以下是引用片段:
If InStr(Request.ServerVariables("HTTP_REFERER"), _
Request.ServerVariables("HTTP_HOST")) = 0 Then
sBadForm = "< LI >表單提交自不正確的位置。" & vbCrlf
End If
如果表單的隱藏域指示必須進(jìn)行服務(wù)器端驗(yàn)證,則程序遍歷表單定義數(shù)據(jù)庫(kù)記錄作相應(yīng)的檢查,其過(guò)程與表單的生成非常相似,只不過(guò)此時(shí)程序是驗(yàn)證表單,且把輸入值非法信息加入到sBadForm中去而已。具體代碼見(jiàn)dForm.asp。
程序最后檢查sBadForm是否為空。如不為空,則拒絕表單提交并將sBadForm寫(xiě)入瀏覽器。如果sBadForm為空,則在Records表增加一個(gè)記錄保存表單數(shù)據(jù)。在保存表單內(nèi)容之前需要?jiǎng)h除隱藏域val,這個(gè)隱藏域總是表單的第一個(gè)輸入域:
以下是引用片段:
If Len(sBadForm) = 0 Then
RS.Open "Records", DB, 3, 2, &H0002
RS.AddNew
RS.Fields("Record") = Mid(Request.Form, InStr(Request.Form, "&") + 1)
RS.Fields("Created") = Now()
RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
RS.Update
Response.Write("< H1 >謝謝.< /H1 >")
RS.Close
Else
Response.Write("< H1 >表單提交失敗。< /H1 >")
Response.Write(vbCrLf & sBadForm)
End If
End If
這就是服務(wù)器端表單處理的全部過(guò)程。根據(jù)是否存在已經(jīng)提交的表單,我們可以把前面生成表單的代碼和這里表單處理的代碼用If語(yǔ)句封裝,使得這兩部分腳本共享部分公用代碼,比如HTML文檔的頭、數(shù)據(jù)庫(kù)對(duì)象的創(chuàng)建和資源釋放等。
總地看來(lái),dForm.asp只具備了動(dòng)態(tài)表單生成、驗(yàn)證所必需的核心功能,忽略了許多細(xì)節(jié)問(wèn)題的處理。比如前面已經(jīng)提到的多表單問(wèn)題:增加一個(gè)表管理多個(gè)表單,使得腳本具有管理、生成、處理指定表單的能力。另外一個(gè)明顯的缺乏是表單定義數(shù)據(jù)的增加、刪除和更新功能,以及用戶(hù)提交結(jié)果數(shù)據(jù)的訪問(wèn),這類(lèi)功能可以在一個(gè)獨(dú)立的程序中實(shí)現(xiàn),而且在大多數(shù)情況下可以做成傳統(tǒng)的應(yīng)用程序(非B/S結(jié)構(gòu)的應(yīng)用)。最后,dForm.asp支持的輸入域類(lèi)型也有限,在實(shí)踐中可能會(huì)有其他的表單輸入要求,比如專(zhuān)用的e-mail地址輸入框等。然而,對(duì)于那些經(jīng)常要更新表單的網(wǎng)站來(lái)說(shuō),本文所討論的表單動(dòng)態(tài)生成、動(dòng)態(tài)驗(yàn)證功能確實(shí)是非常有用的。
相關(guān)文章
ASP下實(shí)現(xiàn)自動(dòng)采集程序及入庫(kù)的代碼
ASP下實(shí)現(xiàn)自動(dòng)采集程序及入庫(kù)的代碼...2007-03-03用ASP讀取/寫(xiě)入U(xiǎn)TF-8編碼格式的文件
用ASP讀取/寫(xiě)入U(xiǎn)TF-8編碼格式的文件...2006-11-11asp執(zhí)行帶參數(shù)的sql語(yǔ)句實(shí)例
這篇文章主要介紹了asp執(zhí)行帶參數(shù)的sql語(yǔ)句實(shí)例,參數(shù)化SQL語(yǔ)句可以有效的防止SQL注入漏洞,需要的朋友可以參考下2014-08-08asp base64 utf-8為了兼容asp.net的base64
asp base64 utf-8為了兼容asp.net的base642009-07-07用asp實(shí)現(xiàn)訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上MDB access數(shù)據(jù)庫(kù)文件的方法
用asp實(shí)現(xiàn)訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上MDB access數(shù)據(jù)庫(kù)文件的方法...2007-11-11把網(wǎng)頁(yè)中的(電話(huà),qq等數(shù)字)生成圖片的ASP程序
下面的代碼可以將網(wǎng)頁(yè)中一些防止別人直接復(fù)制或采集的不錯(cuò)的隱藏部分?jǐn)?shù)字信息,例如電話(huà)可以起到防止別人搜索。2008-11-11ASP 包含文件中的路徑問(wèn)題和使用單一數(shù)據(jù)庫(kù)連接文件的解決方案
全站只需要用一個(gè)數(shù)據(jù)庫(kù)連接文件的實(shí)現(xiàn)函數(shù)代碼2009-03-03