掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

asp中如(rú)何限制(zhì)重複提交同一表單

2019/3/25 9:28:55

asp中如(rú)何限制(zhì)重複提交同一表單

最近鑫冠虛拟主機的(de)客戶反饋,他(tā)們的(de)數據庫中有(yǒu)重複的(de)多條數據存在,我們檢查了客戶的(de)數據庫寫入時間,并不是同時寫入。我們發現其中大(dà)部分(fēn)并沒有(yǒu)限制(zhì)用(yòng)戶多次提交同一個(gè)表單。缺乏這種限制(zhì)有(yǒu)時候會(huì)産生某些預料不到(dào)的(de)結果,如(rú)重複訂閱郵件(jiàn)服務或重複投票等。或許asp初學者程序員并不清楚在asp應用(yòng)中如(rú)何限制(zhì)重複提交同一表單,所以在這裏向大(dà)家介紹在ASP應用(yòng)中防止用(yòng)戶在當前會(huì)話(huà)期間多次提交同一表單的(de)一個(gè)簡單方法。
這個(gè)工(gōng)作主要由四個(gè)子程序組成,在較爲簡單的(de)應用(yòng)場(chǎng)合,你(nǐ)隻要将這些代碼放(fàng)在包含文(wén)件(jiàn)中直接引用(yòng)即可(kě);對于那些較爲複雜的(de)環境,我們在文(wén)章(zhāng)的(de)最後給出一些改進建議。
一、基本工(gōng)作過程
  下面我們依次討(tǎo)論這四個(gè)子程序。
  (一)初始化
  這裏我們要在Session對象中保存兩個(gè)變量,其中:
   ⑴ 每一個(gè)表單對應一個(gè)稱爲FID的(de)唯一标識,爲使該值唯一要用(yòng)到(dào)一個(gè)計(jì)數器(qì)。
   ⑵ 每當一個(gè)表單成功提交,必須在一個(gè)Dictionary對象中存儲它的(de)FID。
  我們用(yòng)一個(gè)專用(yòng)的(de)過程來初始化上(shàng)述數據。雖然以後各個(gè)子程序都(dōu)要調用(yòng)它,但(dàn)實際上(shàng)每一個(gè)會(huì)話(huà)期間它隻執行(xíng)一次:
Sub InitializeFID()
If Not IsObject(Session("FIDList")) Then
Set Session("FIDList")=Server.CreateObject("Scripting.Dictionary")
Session("FID")=0
End If
End Sub
  (二)生成表單的(de)唯一标識符
  下面這個(gè)函數GenerateFID()用(yòng)于生成表單的(de)唯一标志。該函數首先将FID值加1,然後返回它:
Function GenerateFID()
InitializeFID
Session("FID") = Session("FID") + 1
GenerateFID = Session("FID")
End Function
  (三)登記已提交表單
  當表單成功地(dì)提交時,在Dictionary對象中登記它的(de)唯一标識:
Sub RegisterFID()
Dim strFID
InitializeFID
strFID = Request("FID")
Session("FIDlist").Add strFID, now()
End Sub
(四)檢查表單是否重複提交
  在正式處理(lǐ)用(yòng)戶提交的(de)表單之前,應該在Dictionary對象中檢查它的(de)FID是否已經登記。下面的(de)CheckFID()函數用(yòng)來完成這個(gè)工(gōng)作,如(rú)已經登記,它返回FALSE,否則返回TRUE:
Function CheckFID()
Dim strFID
InitializeFID
strFID = Request("FID")
CheckFID = not Session("FIDlist").Exists(strFID)
End Function
二、如(rú)何使用(yòng)
  有(yǒu)兩個(gè)地(dì)方要用(yòng)到(dào)上(shàng)述函數,即表單生成時與結果處理(lǐ)時。假設上(shàng)述四個(gè)子程序已經放(fàng)入包含文(wén)件(jiàn)Forms.inc中,下面的(de)代碼根據FID值來決定生成表單還是處理(lǐ)表單結果,它所描述的(de)處理(lǐ)過程适合于大(dà)多數ASP應用(yòng):
< %Option Explicit%>
< !--#include file="forms.inc"-->
< HTML>
< HEAD>
< TITLE>表單提交測試< /TITLE>
< /HEAD
< BODY>
< %
If Request("FID") = "" Then
GenerateForm
Else
ProcessForm
End If
%>
< /BODY>
< /HTML>
   GenerateForm負責生成表單,表單中應該含有(yǒu)一個(gè)隐藏的(de)FID,如(rú):
< %
Sub GenerateForm()
%>
< form action="< %=Request.ServerVariables("PATH_INFO")%>"
method=GET>
< input type=hidden name=FID value="< %=GenerateFID()%>">
< input type=text name="param1" value="">
< input type=submit value="OK">
< /form>
< %
End Sub
%>
   ProcessForm負責處理(lǐ)通過表單提交的(de)内容,但(dàn)在處理(lǐ)之前應該先調用(yòng)CheckFID()檢查當前表單是否已經提交,代碼類如(rú):
< %
Sub ProcessForm()

If CheckFID() Then

Response.Write "你(nǐ)輸入的(de)内容是" & Request.QueryString("param1")

RegisterFID

Else

Response.Write "此表單隻能(néng)提交一次!"

End If

End Sub
%>

三、限制(zhì)與改進措施
  上(shàng)面我們介紹了在當前會(huì)話(huà)期間限制(zhì)同一表單被多次提交的(de)一種方法。在實際應用(yòng)中可(kě)能(néng)需要從多方面加以改進,例如(rú):

   ⑴ 在登記表單ID之前檢查用(yòng)戶輸入數據的(de)合法性,使得數據不合法時用(yòng)戶可(kě)以


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号