F5押下の対策処理について。
- 評価
- クリップ 2
- VIEW 10K+

退会済みユーザー
現在プログラムの練習で、html, java, javascriptを使い、以下のようなプログラムを書いています。
名前と生年月日、趣味(プルダウン)を入力する登録フォームがあり、登録ボタンをクリックすると、入力したものが一覧で表示されるプログラムです。
現在困っていることですが、一覧ページにてF5ボタンを押下すると、直前に登録フォームで入力したものと同じものが再び登録されてしまうのです。
この場合、どこにどのような実装をすれば防げるのでしょうか。プログラムはjsp・servret・beanを使っています。
もしお分かりになる方がいらっしゃいましたら、教えて頂けないでしょうか。
ソースがなく、分かりづらく申し訳ありません。どうぞよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
2重に登録される原因は、
一般的なブラウザのF5押下時の挙動が、
「最後に送信したリクエストと同じリクエストを送信する」
というものだからです。
*この説明が全くピンと来ない場合はwebアプリケーションにおけるブラウザとサーバの関係について見直してください。
実装する箇所が分からない場合は、jsp、Servret、beansのそれぞれ役割について復讐してみてください。
このリクエストにはPOSTも含まれるため、フォームを再度送信しているのと同じことになります。
対応するためにはいくつか方法があります。
根本的な対策
全く同じ(F5によるリロード)と判断されるリクエストがあった場合は2重投稿と判断し、後から送信されたものに対してエラーを返す。
判断方法は、例えば以下のような方法があります。
フォームにhiddenでユニークな値を埋めておきデータ登録時に一緒に登録する。
データ登録のタイミングでは常にこのユニークな値のDB上に存在するかのチェックをしてから登録する。
簡易的な対策
投稿後に別の二重に送信されても問題の無いリクエストを送信させることによって、F5を押したときに安全なリクエストが送信されるようにする。(投稿完了後に投稿完了画面を表示し、トップページに自動でリダイレクトさせる)
ただしこの場合、戻るボタン等によって同じリクエストの送信は可能であるため、根本的な対策にはなりません。
具体的なソースは
Servret 二重投稿 防止
あたりで検索されると出てくるかと思いますが、
練習ということであれば上記説明をヒントにして、自力で実装を試みることをお勧めします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
例えば、入力中はセッション変数にそういうステータスを記し、
更新時は「入力中」かチェックし、そうなら更新処理をして
ステータスをクリアする。違うならエラー処理なり
スキップ処理なりを実施する。
あと、念のため一覧画面に入ったら上記のセッション変数を
クリアするって感じではどうでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
formのリクエストの送り先を変えれば解決すると思います。
私の勝手な解釈で申し訳ありませんが、
- form.html
- submit.php
- result.html
のような構成にして、formの送信先はsubmit.php、
そのあと「送信が完了しました」と「再度、投稿するならformに飛んでね」
というリンクを表示するresultという構成にしてはどうでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
CHERRY
2016/06/12 18:12
どのようなプログラムかわからないと回答できないので、プログラムのコードを書いてもらえませんか?
退会済みユーザー
2016/06/21 00:38
返信が大変遅れ申し訳ありません。諸事情によりソースの記載ができないのです・・。