サンプルの使い方としては、まず send.asp にアクセスして、HTML フォームを得ます。このフォームには hidden タグとして、ユニークなタグ(ここではフォーム生成時の現在日時)が埋め込まれています。
このフォームに事項を入力して submit すると、receive.asp が動きます。
初回の登録時はフラグが立っていないため、そのまま登録処理(ここでは省いています)が動きます。その際に埋め込みのタグに該当するフラグを立てておきます。
その後、ユーザがブラウザのバックボタンを押して、再度 HTML フォームに戻ります。通常は、ブラウザ側のキャッシュが呼び出されるため、前回と同一の HTML フォームが使われることになり、その中に埋め込まれているタグも前回と同一の値となります。
ここでもう一度 submit しても、receive.asp では、埋め込まれたタグに該当するフラグが立っていることを検知でき、ユーザに誤操作があったことを知らせます。
なお、ここで「ユニーク」なタグとして、「現在日時」を使っているので、どのようなアプリケーションであっても、それを意識することなく使えます。しかし、やりかたとしてはこのようにしなくても、たとえば、固定的な文字列でも良い場合もあります。その場合は、「ユニーク」さの単位が、「Web サーバが生成したページ」ではなく、「Web サーバが出力したある機能のページ」となりますので、ある程度アプリケーションの機能を意識する必要が出てくるでしょう。
ここでは ASP の Session を利用しています。すなわち Session 変数を使い捨てのフラグとして使っています。 なお Session を使うことが必須ではありませんが Session を使わない場合は Application 変数をつかうことになります。 その場合は Application 変数の管理をする必要があるため、若干面倒になるでしょう。
<%@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>
<%@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>