ボタンに割り当てられ、ボタンを押すだけで1回だけ送信できる一意のトークンを作成できます。
これは、ユーザーが新しいボタンを取得するためにページを更新する必要があることを意味します。それが問題である場合は、トークンをボタンではなくユーザーに関連付けます。
上記の方法は、サーバー側のコードを追加する必要があることを意味します。エバークッキーのようなものを使用してクライアント側のボタン押下をログに記録し、ユーザーが別のリクエストを送信してユーザーから別のリクエストを受信するのを防ぐことができるかもしれません-私はこれをprodで行うことをお勧めしませんが、それは楽しいかもしれません;)
病気はもう少し明確にしようとします:
ボタンを生成して、そのボタン用に事前に生成されたuuidを含む「uuid」という非表示フィールドを含むフォームを送信するようにします。このuuidは、データベースまたはメモリに保持する必要があります。適切なuuidlibを使用する場合、ユーザーが既存のuuidを生成する可能性はごくわずかです。
ここで、ユーザーがボタンをクリックすると、アクションは/ my-button /?uuid=3394b0e0-a3bb-11e1-b3dd-0800200c9a66に移動します。
これで、サーバーはuuidが以前に生成されたものであるかどうかを確認します。そうである場合は、格納されている場所からuuidを削除し、アクションに何でも実行させます。uuidが存在しない場合、404を返します。