この件に関していくつかのトピックが作成されていることがわかりましたが、私のケースに適用できる解決策を実際に見つけることができませんでした.
私の問題は、ユーザーが自分のページでフォームを送信すると、ブラウザーが停止し、要求が処理されている間に一部のユーザーがページを更新しようとし、行がデータベースに 2 回挿入されることです。スクリプトの途中に 2 つの curl 呼び出しがあり、完了するまでに数秒かかることがあります。これが遅延の原因です。ページを更新すると、同じセッションの詳細で新しい接続が開き、再度送信されると思いますが、放棄されたバックエンド スクリプトはまだプロセスで動作しています。そして、最も重要な (そして悪い) ことは、フォームがそれ自体に投稿されることです。
いくつかの対策を適用しようとしました (生成されたセッション変数を追跡する SESSION をワイプするなど...) プロセス スクリプトが偽造されたブラウザーで攻撃される可能性があるため、フォームの非表示フィールドはオプションではないと考えています。
私の提案は、プロセス部分をビューから切り離し、別のスクリプトに移行して、Ajax 経由で呼び出すことです。Ajax が呼び出されている間、送信ボタンを無効にして、処理中にページを更新しないようにユーザーに促します。このようにして、ページを更新しても再度送信されることはなく、その時までに、プロセスは SESSION 変数を設定して再送信を防ぐことができます。
このソリューションについてどう思いますか?
システム全体がプロセスに基づいて構築されているため、プロセスに大きな変更を加えることができないため、これが悪い、またはプロセスに悪い、これまたはそれを変更するなどの投稿はしないでください。
どうもありがとう。
////////////////////////////////////////////// /////////////////////////
拡大:
- 自己投稿モンスター スクリプトのプロセス部分を Ajax スクリプトに移行しました。
- ajaxが起動された後、送信ボタンを無効にし、スピナーにテキストを表示してブラウザを更新しないでください
- Ajax スクリプトで操作が完了したときに、プロセスが完了したことを示すセッション変数を設定します
- それでもブラウザを更新すると、フォーム データがクリアされ、もう一度入力する時間がなくなるため、フォームを再度送信するまでに、セッション変数はすでに設定されており、送信ボタンを押すと、メッセージが表示され、確認ページにリダイレクトされます。
これまでのところ、数回のテスト実行で問題なく動作しているようです。
皆さんは、このソリューションについてどう思いますか? 抜け穴やセキュリティへの影響はありますか? (Json 経由でスクリプトからエラー メッセージが送信されます)