私たちは毎日インターネット上で無数のフォームに遭遇しますが、そのほとんどはユーザーが同じフォームを複数回送信することを制限していません。このような制限がない場合、電子メール サービスの繰り返し登録や投票の繰り返しなど、予期しない結果が生じる場合があります。 ASP 初心者の中には、ASP アプリケーションで同じフォームの繰り返し送信を制限する方法がわからない人もいるかもしれません。そこで、ここでは、ASP アプリケーションで現在のセッション中にユーザーが同じフォームを複数回送信できないようにする簡単な方法を紹介します。
この作業は主に 4 つのサブルーチンで構成されています。単純なアプリケーションでは、これらのコードを直接参照するために付属のファイルに入れるだけで済みます。より複雑な環境では、記事の最後にいくつかの改善案を示します。
1. 基本的な作業プロセス
以下では、これら 4 つのサブルーチンについて順番に説明します。
(1) 初期化
ここでは、Session オブジェクトに次の 2 つの変数を保存する必要があります。
⑴ 各フォームは FID と呼ばれる一意の識別子に対応しており、この値を一意にするためにカウンタが使用されます。
⑵ フォームが正常に送信されるたびに、その FID を Dictionary オブジェクトに保存する必要があります。
上記のデータは専用のプロセスを使用して初期化されます。これは将来的に各サブルーチンによって呼び出されますが、実際には各セッション中に 1 回だけ実行されます:
Sub InitializeFID()
IsObject(Session("FIDList")) でない場合は、
Set Session("FIDList")=Server.CreateObject("Scripting.Dictionary")
セッション("FID")=0
終了の場合
End Sub
(2) フォームの一意の識別子を生成する
次の関数 GenerateFID() を使用して、フォームの一意の識別子を生成します。この関数は、まず FID 値を 1 だけインクリメントしてから、その値を返します。
Function GenerateFID()
FIDの初期化
セッション("FID") = セッション("FID") + 1
GenerateFID = セッション("FID")
関数終了
(3) 送信されたフォームを登録します。
フォームが正常に送信されたら、その一意の識別子を Dictionary オブジェクトに登録します:
Sub RegisterFID()。
ディム strFID
FIDの初期化
strFID = リクエスト("FID")
Session("FIDlist").strFID を追加、now()
End Sub
(4) フォームが繰り返し送信されているかどうかを確認する
ユーザーが送信したフォームを正式に処理する前に、その FID が Dictionary オブジェクトに登録されているかどうかを確認する必要があります。次の CheckFID() 関数は、この作業を完了するために使用されます。登録されている場合は FALSE を返し、登録されていない場合は TRUE を返します
。
ディム strFID
FIDの初期化
strFID = リクエスト("FID")
CheckFID = Session("FIDlist").Exists(strFID) ではありません
End 関数
2. 使用方法
上記関数を使用する場所は、フォーム生成時と結果処理時の 2 か所です。上記の 4 つのサブルーチンが、含まれているファイル Forms.inc に配置されているとします。次のコードは、FID 値に基づいてフォームを生成するか、フォームの結果を処理するかを決定します。この処理プロセスは、ほとんどの ASP アプリケーションに適しています
。 %オプション明示%>
< !--#include file="forms.inc"-->
<HTML>
<頭>
<TITLE>フォーム提出テスト</TITLE>
</頭
<ボディ>
< %
Request("FID") = "" の場合
フォームの生成
それ以外
プロセスフォーム
終了の場合
%>
</BODY>
< /HTML>
GenerateForm はフォームの生成を担当します。フォームには次のような非表示の FID が含まれている必要があります。
< %
SubGenerateForm()
%>
< フォームアクション="< %=Request.ServerVariables("PATH_INFO")%>" メソッド=GET>
< 入力タイプ=隠し名=FID値="< %=GenerateFID()%>">
<input type=text name="param1" value="">
<入力タイプ=送信値=”OK”>
</フォーム>
< %
エンドサブ
%>
ProcessForm はフォームを通じて送信されたコンテンツを処理しますが、処理の前に CheckFID() を呼び出して、現在のフォームが送信されたかどうかを確認する必要があります。コードは次のとおりです
。
サブプロセスフォーム()
CheckFID() の場合
Response.Write "入力した内容は" & Request.QueryString("param1")
FID を登録する
それ以外
Response.「このフォームは一度しか送信できません!」と書きます。
終了の場合
エンドサブ
%>
3. 制限と改善策
上記では、現在のセッション中に同じフォームが複数回送信されることを制限する方法を紹介しました。実際の応用においては、例えば以下のような点で改善が必要と考えられる。
⑴ フォームIDを登録する前に、ユーザーが入力したデータの正当性をチェックし、データが不正な場合にユーザーが「戻る」を押せるようにする。ボタンをクリックして戻り、修正後に同じフォームを再度送信します。
⑵ フォーム送信に関するこの制限は、最大でも現在のセッションの期間のみ有効です。複数のセッションにまたがる場合にこの制限が必要な場合は、Cookie またはデータベースを使用して関連データを保存します。