Spring で重複したフォーム送信を回避する最善の方法は何ですか? このフレームワークは、この問題を処理するための特別な機能を提供していますか ( StrutsのSynchronizer Tokenなど)?
3 に答える
二重送信を回避するにはさまざまな方法があり、これらを組み合わせることができます。
disable
ボタンをクリックしてから数ミリ秒後にJavaScript を使用します。これにより、せっかちなユーザーがボタンを複数回クリックすることによる複数の送信が回避されます。送信後にリダイレクトを送信します。これはPost-Redirect-Get (PRG) パターンと呼ばれます。これにより、ユーザーが結果ページで F5 キーを押して、データが再送信されるというブラウザーの警告を無視したり、ブラウザーの戻る/進むボタンで前後に移動して同じ警告を無視したりすることによって、複数の送信が発生することを回避できます。
ページが要求されたときに一意のトークンを生成し、セッション スコープとフォームの非表示フィールドの両方に配置します。処理中にトークンが存在するかどうかを確認し、すぐにセッションから削除して処理を続行します。トークンが存在しない場合は、処理をブロックします。これにより、前述の種類の問題が回避されます。
RedirectView
Springでは、PRG パターンの実装として使用できます(ポイント 2 で説明)。残りの 2 点は、自分で実装する必要があります。
このページはあなたの質問に答えているようです(つまり、トークンの問題についてです。質問のjavascriptとpost-redirect-getの部分はここではカバーされていません):
http://explodingjava.blogspot.com/2009/03/spring-mvc-synchronizer-token.html
投稿後にリダイレクトするだけです。フォームの送信が成功した後、ModelAndView を返すときに、View が RedirectView であることを確認してください。ユーザーの POV からフォームを送信すると、別の URL に「GET」するためにリダイレクトされます。このようにして、彼らは二重に提出しません。
リダイレクト ビューを使用する場合、モデル属性が URL でパラメータとして公開されることに注意してください。そのため、属性をできるだけ薄くしたい場合があります。私が通常行うことは、固有の情報を実際には含まず、「確認」メッセージだけを含むページをユーザーに表示することです。