質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

18926閲覧

F5押下の対策処理について。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2016/06/12 08:49

編集2016/06/12 08:49

現在プログラムの練習で、html, java, javascriptを使い、以下のようなプログラムを書いています。

名前と生年月日、趣味(プルダウン)を入力する登録フォームがあり、登録ボタンをクリックすると、入力したものが一覧で表示されるプログラムです。

現在困っていることですが、一覧ページにてF5ボタンを押下すると、直前に登録フォームで入力したものと同じものが再び登録されてしまうのです。

この場合、どこにどのような実装をすれば防げるのでしょうか。プログラムはjsp・servret・beanを使っています。
もしお分かりになる方がいらっしゃいましたら、教えて頂けないでしょうか。

ソースがなく、分かりづらく申し訳ありません。どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2016/06/12 09:12

どのようなプログラムかわからないと回答できないので、プログラムのコードを書いてもらえませんか?
退会済みユーザー

退会済みユーザー

2016/06/20 15:38

返信が大変遅れ申し訳ありません。諸事情によりソースの記載ができないのです・・。
guest

回答3

0

ベストアンサー

2重に登録される原因は、
一般的なブラウザのF5押下時の挙動が、
「最後に送信したリクエストと同じリクエストを送信する」
というものだからです。
*この説明が全くピンと来ない場合はwebアプリケーションにおけるブラウザとサーバの関係について見直してください。
実装する箇所が分からない場合は、jsp、Servret、beansのそれぞれ役割について復讐してみてください。

このリクエストにはPOSTも含まれるため、フォームを再度送信しているのと同じことになります。
対応するためにはいくつか方法があります。

根本的な対策
全く同じ(F5によるリロード)と判断されるリクエストがあった場合は2重投稿と判断し、後から送信されたものに対してエラーを返す。
判断方法は、例えば以下のような方法があります。

フォームにhiddenでユニークな値を埋めておきデータ登録時に一緒に登録する。
データ登録のタイミングでは常にこのユニークな値のDB上に存在するかのチェックをしてから登録する。

簡易的な対策
投稿後に別の二重に送信されても問題の無いリクエストを送信させることによって、F5を押したときに安全なリクエストが送信されるようにする。(投稿完了後に投稿完了画面を表示し、トップページに自動でリダイレクトさせる)
ただしこの場合、戻るボタン等によって同じリクエストの送信は可能であるため、根本的な対策にはなりません。

具体的なソースは
Servret 二重投稿 防止
あたりで検索されると出てくるかと思いますが、
練習ということであれば上記説明をヒントにして、自力で実装を試みることをお勧めします。

投稿2016/06/12 11:27

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/20 15:32

返信が遅れ申し訳ありません。ご回答ありがとうございます。 教えていただいた「Servret 二重投稿 防止」検索で実装が出来そうです。ありがとうございました!
guest

0

formのリクエストの送り先を変えれば解決すると思います。

私の勝手な解釈で申し訳ありませんが、

  • form.html
  • submit.php
  • result.html

のような構成にして、formの送信先はsubmit.php、
そのあと「送信が完了しました」と「再度、投稿するならformに飛んでね」
というリンクを表示するresultという構成にしてはどうでしょうか?

投稿2016/06/14 05:53

mtempa

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/20 15:37

返信が遅れ申し訳ありません。ご回答ありがとうございます! 今一度構成について考えてみたいと思います。
guest

0

例えば、入力中はセッション変数にそういうステータスを記し、
更新時は「入力中」かチェックし、そうなら更新処理をして
ステータスをクリアする。違うならエラー処理なり
スキップ処理なりを実施する。
あと、念のため一覧画面に入ったら上記のセッション変数を
クリアするって感じではどうでしょうか。

投稿2016/06/12 11:43

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/20 15:34

返信が遅れ申し訳ありません。セッション変数を使う方法があるのですね・・。まだセッション変数はあつかったことがないのでこれを機に調べてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問