複数回の submit を抑制する (unibon)

1999年09月19日: 新規作成。
誤操作により HTML フォームの submit が複数回おこなわれてしまい、一度で良い登録処理が複数回なされてしまうことを抑制します。
ユーザが HTML フォームに入力事項を入力して、submit を押せば、サーバサイドで登録処理をおこなうのが普通ですが、 一旦登録されたあとに、Web ブラウザのバックボタンを押されて、残っている HTML フォームを使い、再度 submit されてしまうと、 再びサーバサイドで登録処理が動いてしまい、いわゆるダブりとなってしまいます。
これを防止するためには、ブラウザ側のキャッシュを制御する方法なども考えられますが、 ここでは、HTML フォームに固有のタグを埋め込んでおき、サーバサイドで判断するやりかたを示します。

サンプルの使い方としては、まず send.asp にアクセスして、HTML フォームを得ます。このフォームには hidden タグとして、ユニークなタグ(ここではフォーム生成時の現在日時)が埋め込まれています。
このフォームに事項を入力して submit すると、receive.asp が動きます。
初回の登録時はフラグが立っていないため、そのまま登録処理(ここでは省いています)が動きます。その際に埋め込みのタグに該当するフラグを立てておきます。
その後、ユーザがブラウザのバックボタンを押して、再度 HTML フォームに戻ります。通常は、ブラウザ側のキャッシュが呼び出されるため、前回と同一の HTML フォームが使われることになり、その中に埋め込まれているタグも前回と同一の値となります。
ここでもう一度 submit しても、receive.asp では、埋め込まれたタグに該当するフラグが立っていることを検知でき、ユーザに誤操作があったことを知らせます。

なお、ここで「ユニーク」なタグとして、「現在日時」を使っているので、どのようなアプリケーションであっても、それを意識することなく使えます。しかし、やりかたとしてはこのようにしなくても、たとえば、固定的な文字列でも良い場合もあります。その場合は、「ユニーク」さの単位が、「Web サーバが生成したページ」ではなく、「Web サーバが出力したある機能のページ」となりますので、ある程度アプリケーションの機能を意識する必要が出てくるでしょう。

ここでは ASP の Session を利用しています。すなわち Session 変数を使い捨てのフラグとして使っています。 なお Session を使うことが必須ではありませんが Session を使わない場合は Application 変数をつかうことになります。 その場合は Application 変数の管理をする必要があるため、若干面倒になるでしょう。


HTML フォームを生成する ASP(send.asp):
<%@Language=VBScript EnableSessionState=True%>
<%Option Explicit%>
<HTML>
<BODY>
<FORM ACTION=receive.asp METHOD=POST>
<INPUT TYPE=text NAME=mytext VALUE="test"><BR>
<INPUT TYPE=hidden NAME=myhidden VALUE="<%=CDbl(Now())%>"><BR>
<INPUT TYPE=submit VALUE="押せ">
</FORM>
</BODY>
</HTML>

submit された HTML フォームを受ける ASP(receive.asp):
<%@Language=VBScript EnableSessionState=True%>
<%Option Explicit%>
<HTML>
<BODY>
<%
Dim x
x = Request.Form("myhidden")
If IsEmpty(Session("hiddenprefix" & x)) Then
    Call Response.Write("登録しました。<BR>" & vbNewLine)
    Session("hiddenprefix" & x) = True
Else
    Call Response.Write("すでに登録されています。<BR>" & vbNewLine)
End If
%>
</BODY>
</HTML>

ASP の目次
ホーム
(このページ自身の絶対的な URL)