19

Webアプリケーション(J2EE)に取り組んでいますが、ブラウザーからの二重投稿を処理するために使用できるオプションを知りたいです。

私が過去に見て使用したソリューションはすべてクライアント側です。

  • ユーザーが送信ボタンをクリックするとすぐに無効にします。
  • POST-Redirect-GETパターンに従って、ユーザーが[戻る]ボタンをクリックしたときにPOSTが発生しないようにします。
  • フォームのonSubmitイベントを処理し、JavaScriptを使用して送信ステータスを追跡します。

可能であれば、サーバー側のソリューションを実装したいと思います。上記のアプローチよりも優れたアプローチはありますか、それともクライアント側のソリューションが最適ですか?

4

7 に答える 7

11

ばかげた解決策を実装するのは難しい(彼らは常にばかを改善しているので)。 何をしても、クライアント側が操作されたり、正しく実行されなかったりする可能性があります。

信頼性と安全性を確保するには、ソリューションをサーバー側にする必要があります。 とはいえ、1つのアプローチは、要求を確認し、システム/データベースの状態またはログをチェックして、要求がすでに処理されているかどうかを判断することです。理想的には、サーバー側のプロセスは、可能であればべき等である必要があり、そうでない場合は、重複した送信から保護する必要があります。

于 2008-09-24T22:38:43.640 に答える
9

フォームの一部として「チケット」と乱数を指定し、サーバー側で2回受け入れられないようにすることができます。

于 2008-09-24T22:35:57.890 に答える
4

2つのサーバー側ソリューションが思い浮かびます。

  1. 非表示のフォームフィールドに1回限りの「トークン」を作成します。トークンが使用されると、それを格納しているデータベースまたはセッションコンテキストオブジェクトから削除されます。2回目は、トークンは受け入れられません。
  2. 受信した情報をキャッシュし、同じフォームが特定の期間(10分?1時間?あなたが決める!)内に受信された場合、それは無視されます。
于 2008-09-24T22:36:58.810 に答える
3

時間に敏感な1回限りのチケットを使用します。これは、ある種のセッションIDのようなものです。しかし、それはフォーム/ページに結びついています。

ユーザーがページを送信したときにチケットを破棄し、有効なチケットが付属しているページのみを処理します。同時に、ユーザーにチケットを添付することでセキュリティを強化できるため、チケットが送信されたユーザーではないユーザーによって送信されたチケットが着信した場合は、リクエストを拒否します。

于 2008-09-24T22:40:03.763 に答える
2

リクエストに対応するuniqueidを実装し、実行とともにログに記録します。IDがすでにログに記録されている場合は、そのジョブを再度実行することはありません。これは、フォールバックソリューションのようなものです。自分で提案したのと同様に、ボタンを無効にするか、クライアント側をリンクする必要があります。

于 2008-09-24T22:37:19.590 に答える
2

Struts には、たまたま使用している場合、このようなものが組み込まれています。

http://struts.apache.org/1.x/apidocs/org/apache/struts/util/TokenProcessor.html

于 2008-09-25T03:10:58.963 に答える
-2

タイムスタンプを使用して、値をサーバー側のコードと比較します。2つのタイムスタンプが十分に近く、同じIPアドレスを持っている場合は、2番目のフォーム送信を無視してください。

于 2008-09-24T22:37:20.540 に答える