2017-07-11 10 views
2

PHPで作業しているときにフォームの重複を避けるために、ある種類の一意のIDを生成し、それをセッション変数に格納し、私は値を比較し、その時点でセッション値を再生成することができます。私はそれを素晴らしい解決策とは考えませんでしたが、私は決してより良い解決策を考えたり見つけることができませんでした。ステートレスシステムで重複したフォームの提出を防ぐ

私はPHPバックエンド(ルーメン)でAngularフロントエンドをやっています。私はデータベースに書き込むことを必要としないソリューションを考えるのに苦労しています。私が何かを誤解していない限り、AngularとPHPの間でセッションを使用することはできません。したがって、この解決法は機能しません。私が考えることができる唯一の他の事は、DBにキー/ペア値を持たせることですが、セッション/データベースが2番目のキーの前にキーを更新しないかもしれない偶発的なダブルクリック提出が処理を開始します。私はステートレスシステムについてもっと学んでいるので、セッションはこの種のものを置くのに最適な場所ではないと感じていますか?

全体的に、重複したフォームを避けるための安全なバックエンドシステムの作成には問題があります。角度を使用すると、ボタンのクリック、発砲からのAPI呼び出しなどを避けて、重複した投稿をいつでも防ぐことができますが、バックエンドの保護機能も追加したいと思います。

+2

は、なぜあなたは、バックエンドのPが必要になります重複したフォームの提出を防ぐための腐敗?安全上重要なことが起こっていますか?私にとって、単純なクライアント側チェックを超えて本当に気にするべきもののようには見えません。 – eis

+1

IMHOクライアントサイドの問題だと思うのですが、ボタンをクリックした後にボタンを無効にしないのはなぜですか? –

+0

これらの質問と答えは私の質問に答えています:私の考え方は常にフロントエンドを信頼していません。しかし、この場合、フロントエンド/バックエンドはお互いが何をしているのか気にしてはいけません。ありがとう。 – RhoVisions

答えて

1

私はそれをハックする方法はあると確信していますが、簡単な答えはあなたがハックしたくないということです。スプリットバック/フロントエンドに移行する際には、具体的には、APIにステートレスコールを行うことが1つあります。これは良いことです!ステートレス、セッション不足など、バックエンドアプリケーションを大幅に簡素化できます。一言で言えば、ステートレスはあなたがこのようなことをする理由の半分です。

あなたがしていたように、二重提出を防ぐことは、ステートフルなアプリケーションが必要なことです。その結果、フロントエンドアプリケーションの仕事が排他的になりました。

あなたの最良の賭けは全く新しい方法であなたのアプリケーションについて考えることです。あなたのPHPバックエンドはステートレスなRESTリクエストを処理します。したがって、重複した投稿を受け取った場合、PHPの問題ではありません。実際には、角度は、重複が提出されないようにしても問題ありません(フロントエンドでの回避は本当に簡単です)。あなたのPHPバックエンドが常に適切な応答を返すことを確認する必要があります。したがって、例えば登録ページでは、バックツーバックの重複登録要求は、登録が成功し、「その電子メールが既に存在する」というメッセージ(またはそのようなもの)で登録に失敗します。それ以外の場合、PHPバックエンドは気にしません。私はまだその仕事をすることができます。二重提出が起こらないことを確認するか、そうであれば矛盾する回答を理解するのはクライアントの仕事です。

APIコールでは、無国籍性は望ましい品質です。あなたがそれを悩ませると、あなたの人生ははるかに難しくなります。

2

ほとんどの場合、これはフロントエンドで保護する必要があります。バックエンドの保護ソリューションは、独自の要求の定義に依存します。リクエストを一意にする属性から複合キーを作成することができます。たとえば。電子メールID、リクエストID、または任意のリクエストパラメータのセット

DBは重複キーを受け入れず、例外をキャッチしてフロントエンドで正常に処理できます。

例:ニュースレターの購読申請申込書 - リクエストの一意性はメールアドレスとニュースレターの種類によって決まります

0

ロジックは単純です。送信ボタンを無効にして、フォーム送信時にユーザーにローダーを表示し、ボタンを再び有効にして、最初のAPIから応答を受け取ったときにローダーを非表示にするだけでなく、あまりにも。ここで、ユーザが同じ詳細を使ってフォームを再度提出すると、古い保存データに簡単にアクセスして比較することができ、すでにフィールドが提出されていることをユーザに警告することができます。

あなたは4角度または2を使用している場合は、

[無効]、* ngIfまたは[隠さ]、観測が

がリセットするのに役立ちますフォームformRef.reset() https://codecraft.tv/courses/angular/forms/submitting-and-resetting/

と角度1つの NG不可、NG-場合やHTTPの約束が を助けるし、フォームをリセットするため angularjs form reset error

関連する問題