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