ASP應用對於同一表單被多次提交的限制

2021-08-23 11:28:18 字數 2533 閱讀 1340

在internet上我們每天都會遇到數不清的表單,也看到其中大部分並沒有限制使用者多次提交同乙個表單。缺乏這種限制有時候會產生某些預料不到的結果,如重複訂閱郵件服務或重複投票等。

本文介紹在asp應用中防止使用者在當前會話期間多次提交同一表單的乙個簡單方法。它主要由四個子程式組成,在較為簡單的應用場合,你只要將這些**放在包含檔案中直接引用即可;對於那些較為複雜的環境,我們在文章的最後給出一些改進建議。

一、基本工作過程

下面我們依次討論這四個子程式。

(一)初始化

這裡我們要在session物件中儲存兩個變數,其中:

⑴ 每乙個表單對應乙個稱為fid的唯一標識,為使該值唯一要用到乙個計數器。

⑵ 每當乙個表單成功提交,必須在乙個dictionary物件中儲存它的fid。

我們用乙個專用的過程來初始化上述資料。雖然以後各個子程式都要呼叫它,但實際上每乙個會話期間它只執行一次:

以下為引用的內容:

sub initializefid()

if not isobject(session("fidlist")) then

set session("fidlist")=server.createobject("scripting.dictionary")

session("fid")=0

end if

end sub

(二)生成表單的唯一識別符號

下面這個函式generatefid()用於生成表單的唯一標誌。該函式首先將fid值加1,然後返回它:

以下為引用的內容:

function generatefid()

initializefid

session("fid") = session("fid") 1

generatefid = session("fid")

end function

(三)登記已提交表單

當表單成功地提交時,在dictionary物件中登記它的唯一標識:

以下為引用的內容:

sub registerfid()

dim strfid

initializefid

strfid = request("fid")

session("fidlist").add strfid, now()

end sub

(四)檢查表單是否重複提交

在正式處理使用者提交的表單之前,應該在dictionary物件中檢查它的fid是否已經登記。下面的checkfid()函式用來完成這個工作,如已經登記,它返回false,否則返回true:

以下為引用的內容:

function checkfid()

dim strfid

initializefid

strfid = request("fid")

checkfid = not session("fidlist").exists(strfid)

end function

二、如何使用

有兩個地方要用到上述函式,即表單生成時與結果處理時。假設上述四個子程式已經放入包含檔案forms.inc中,下面的**根據fid值來決定生成表單還是處理表單結果,它所描述的處理過程適合於大多數asp應用:

以下為引用的內容:

< %option explicit%>

< !--#include file="forms.inc"

< html>

< head>

< title>表單提交測試< /title>

< /head

< body>

< %

if request("fid") = "" then

generateform

else

processform

end if

%>

< /body>

< /html>

generateform負責生成表單,表單中應該含有乙個隱藏的fid,如:

以下為引用的內容:

< %

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負責處理通過表單提交的內容,但在處理之前應該先呼叫checkfid()檢查當前表單是否已經提交,**類如:

以下為引用的內容:

< %

sub processform()

if checkfid() then

response.write "你輸入的內容是"

MYSQL 刪除同一表中重覆記錄

mysql 刪除同一表中重覆記錄 create table user db id varchar 255 not null,name varchar 45 default null,age int 10 unsigned not null,address varchar 45 default nul...

MySQL學習 一) 表

看下面這幅圖,建立表的額基本組成都有了。嘻嘻,還有沒有的,用到再了解吧。下面我主要從鍵做深層次的理論方面 的理解以及實踐。其他的只說一下概念及用法即可。有相同名字的學生 舉個列子 學生 學號,姓名,課程號,課程 課程號,課程名,課程老師 學生表的超鍵有 學號 學號,姓名 學號,課程號 學號,姓名,課...

oracle 一表多資料

insert into smap.smap system user role user id,role id,role scope select 30 3 all from dual union all select 30 2 all from dual union all select 30 4 ...