リロードによる二重投稿を阻止するには?

[上に] [前に] [次に]
くろっくぁ 1999/07/28(水) 20:05:39
掲示板なんかで、投稿した後リロードすると、前発言した内容が
CGIに送られてしまい、同じ内容の記事がいくつも表示される羽目に
なると思うのですが、これを阻止する方法は無いのでしょうか。
いちいちログファイルを開いて、内容を比較する方法も
あると思うのですが、あまり効率的とは思えないので・・・。

やま 1999/07/28(水) 23:26:43
完全な阻止にはならないかもしれないけど・・・
投稿後すぐに次の表示に移るのではなく、間に
「このページをリロードしないでください」みたいな
ページを挟んでみてはどうでしょう。

ST 1999/07/29(木) 00:52:25
書き込み処理の後に
print "Location: $bbsのurl\n\n";
exit;
とでも追加すればいいと思いますが。

私自身MiniBBSを改造して使っているのですが,これって何か弊害があるのでしょうか(^^; 心配だ……。

やま 1999/07/29(木) 02:17:54
> print "Location: $bbsのurl\n\n";
これをしても再投稿されてしまった記憶があります。
(曖昧な記憶です)
どうでしたでしょうか?

ひ*** 1999/07/29(木) 04:12:10
フォームの送信ボタンでリロードするってことでいいんですよね?

リロードする時はフォームの中は空っぽだから、ウチでは
if(! $FORM{'MESSAGE'}) { &error; }
とかと同じ発想で
if(! $FORM{'MESSAGE'}) { return 0; }
ってしてサブルーチンから抜けだしてしまいますよ。
ウチはコレにしてから二重投稿はなくなりました。

得名 1999/07/29(木) 08:42:38
print "Location: $bbsのurl\n\n";
exit;
↑これでやっぱりcgiを表示するときにログファイルを開いてしまいますから、
やっぱりログを読み込んで、一番新しいログと比較するか、前回投稿された
時間を記録しておいて、一定時間たたないと書き込めないようにするほうが
いいようにおもいます。
だいたい、2重書き込みって、サーバーの重たい時間帯に、
書き込まれたか不安になって、もう一度送る人が起こす事が多いようにもおもえますし。。

エイ 1999/07/29(木) 10:07:06
>やっぱりログを読み込んで、一番新しいログと比較するか、

だな。
だいたい2重投稿が起こる時ってなぁ、
・回線ないしCGIが重い
・それで結果が投稿者になかなか返ってこない
・不安になって再送信
なんて流れになってるのがほとんどだ。

比較用に最新のログ1件を保存する機能を追加してそれとチェックすると、
本物ログの一部を切り出す作業をしなくていいから改造楽かもね。
# チェックに引っかかったら単純にLocationですっ飛ばして終了。
## 爆撃に対してもささやかではあるが防御力が上がる。

あと、投稿後のリロードも確かに原因になるから
# 経験上、上の原因の方が多いけど。

>「このページをリロードしないでください」みたいなページを挟んでみてはどうでしょう。

のも有効。記入欄に「注意書き」だけでもいいと思うが。

くろっくぁ 1999/07/29(木) 22:53:04
みなさんありがとうございます。
せっかくアドバイスを頂いたのですが、
うまくいきません。
フォームのリロードには対応していたのですが、
ブラウザの「更新」を押すと同じ記事がえんえんと
投稿されてしまいます。
完全に阻止したいのですが。

ST 1999/07/29(木) 23:21:32
Locationも試してみましたか?

・ボタン連打によって再投稿されてしまう
場合にはログ比較法が良いと思いますが,元の質問の,

・投稿した後にリロードすると再投稿されてしまう
という場合には,
print "Location: bbsのurl\n\n";
で効くのでは無いでしょうか。もう一度お聞きしますが,弊害があればどなたかご教授願います。
少なくともMiniBBSの場合は書き込み処理の後,そのまま読み込み・表示処理へ行きますので,そこにLocationを使ってもそんなに大きな影響はないと思うのですが(そうでもないか^^;)。大抵の掲示板システムも書き込み時の処理はMiniBBSと同じような構成だと思います。

POSTで投稿した場合,IEではリロードしようとすると「再送信しますか?Y/N」といったダイアログが出るので,それが鬱陶しいというのもあるのですが。

くろっくぁ 1999/07/30(金) 23:04:07
[[解決]]
ありがとうございました。
うまくいきました。

[上に] [前に] [次に]