2011-09-09 14 views
3

エンドユーザーは、送信ボタンを2回押してトランザクションを完了させないように指示されることがよくあります。この状況に対処するために使用されるさまざまな手法があります。送信後にユーザーがページを更新することができますか?

最近、「送信後にページを更新するユーザーの状況を処理するためには何をしますか」という質問がありました。これは、送信またはその他の問題が発生する可能性があることを意味します。

これが本当の問題であるかどうか教えてください...どういう状況にあるのか、どうすればそれをどうすれば解決できるか教えてください。

+5

ほとんどのブラウザは、ユーザーがフォームの提出を更新している場合に警告します。 – BoltClock

+1

これは、ダブル投稿、重複アップロードなどのような問題を引き起こす可能性があります。最初の送信にタイムスタンプを添付し、送信プロセスを検証しながら、そのユーザーが最近フォームを送信したかどうかを確認します。 IP参照またはログイン参照の直前の1時間(3600秒)。そうであれば、新しい送信を無視して、エラーやリダイレクトを表示します。これがあなたの質問に答えるなら、私は必要に応じて例を挙げることができますか? – Joe

+0

ファンタスティックジョー - 私はあなたが正確な問題/解決策を持っていると思います。 – Ray

答えて

2

はい、あなたの側で処理しない限り、これは本当の問題です。ほとんどのブラウザでは、ユーザーがリフレッシュしたときにデータが再送信され、サーバー側でこれをチェックしないと、同じアクションを2回実行することになります(例えば、クレジットカードを2回請求する、 )。

これを処理する方法は、ユーザーが以前に投稿を行ったかどうかを確認することです。たとえば、フォーラムを構築する場合は、ポストに一意のIDを持つ隠し変数を送信します。投稿されたデータを解析する際に、この一意のIDをデータベースに保存します。すでに保存されている一意のIDを持つ投稿に遭遇した場合は、クライアント側で「更新」していることを知っているだけで、投稿を無視するだけです。

希望すると便利です。

+0

ビートリー - ありがとう。これはとても簡単です。注意しなければならない特別なケースはどれですか?ジョーのように見える(私の質問に対するコメントで)同様のソリューションを使用します。思考/コメント。おかげで – Ray

+0

ええ、あなたも考慮する必要がある他のケースがあります。例えば、人々は「戻るボタン」を押すかもしれない。あなたが投稿をしている場合、彼らはプロンプトが与えられますが、あなたが "GETs"をしているなら、それは多くの問題を引き起こす可能性があります。 たとえば、GETで「切り替え」を行ったとします。ユーザーはトグルをヒットし、新しいページに移動してから「戻る」を押します。これはあなたのトグル機能を再び打ち、ユーザーは気付かないかもしれません。ここでは同じIDを持つソリューションを使って、物事をやり直さないようにしています。 私の回答が役に立ちましたことをうれしく思います! – beetree

+0

私はあなたのことを正しく理解していれば、投稿は「良い」ものです。私はGETで "トグル"を取得していません。あなたは "トグル"の例を挙げることができます。すべてのあなたの洞察力を賞賛する...非常に有用/興味深い。 – Ray

1

はい、実際の問題ですが、これは通常ブラウザで処理されると思います。結果としてサーバーに投稿されたデータがある場合は、Chromeがインスタンスの更新を通知し、続行または中止のオプションが表示されます。

EDIT:

実は...私は仕事でこれに対処しなければならなかったことを考えるようになります。私は、プロセスを視覚的プロセスが動作していたことをフィードバックし、

  • 防ぎ、他のユーザーアクションを与える

    1. に完了したそれまではページの上にシャドーボックスを作成してやってしまった何を。
  • +0

    またはそれに関する任意のページリダイレクトは重要な部分であり、ベストプラクティスとみなされます。 – PeeHaa

    +0

    @PeeHaaは明らかにそうではありません。 :Pコミュニティは同意しない。 –

    +0

    まあ...私はコミュニティが同意すると思います。 :)ああ、私から+1してください:) – PeeHaa

    0

    フォームが正常に送信された後、あなたはページへをリダイレクトする必要があり

    「あなたが提出を行った後にページの更新を行っているユーザーの状況に対処するために何をしますか」。

    これにより、ユーザーは再度データを送信して、データを送信するブラウザの不意の警告が再び送信されるのを防ぐことができます。

    +0

    @Downvoter:なぜdownvote?ジョセフの答えにも? – PeeHaa

    2

    ユーザーがページをリフレッシュする傾向にある場合は、の方法の応答時間が長すぎるようです。送信時に送信ボタンを無効にし、応答が返るまで何らかのローディングインジケータを表示します。

    また、サーバーですぐに応答し、後で実行するためにアクションをキューに入れます。たとえば、Linodeは、「要求のサイズを変更する要求」で直ちに実行するのではなく、サーバーの動作をキューに入れます。このアプローチを他の振る舞いに対して一般化することができ、進捗インジケータなどをajaxで表示することさえできます。

    +0

    ステファン - このコメントをいただきありがとうございます。他のコメント/答えは非常に啓発的です(私にとって)。ローディングインジケーターも良いと思う。ありがとう。 – Ray

    10

    これを解決する最善の方法は、Post/Redirect/Get patternです。

    +0

    マット - 問題を説明してくれたこのリファレンスに感謝します。私はまだそれを消化しています。あなたはベートリーの答えを見ましたか? – Ray

    +0

    確かに、私はしました。それは何ですか? –

    +0

    私はこの記事全体をまだ消化しており、すべての状況や問題を処理していないとも見ていました。あなたはP/R/Gがbeetreeの解決策ではない問題を抱えていると感じますか?残念ながら、私はまだクライアントとサーバーの間のHTTP 30Xメッセージングの全体には全く新しいものです。 – Ray

    1

    はい、問題になる可能性があります(実際には多くのウェブサイトで問題になります)。 しかし、これはJavascriptよりもサーバー側の問題だと思います。 ベストプラクティスはPost/Redirect/Getパターンを使用することです(送信後にリフレッシュすることを具体的に尋ねているので)。

    +0

    Anthonyさん、ありがとうございます - このリンクはこう書いています: "PRGパターンは重複したフォーム提出のすべてのシナリオに対処できません"メッセージ。 beetreesの反応を見ましたか?かなりシンプルに聞こえます。 – Ray

    +0

    @Ray、yes /タイムスタンプ/操作を一意に識別し、サーバー側の処理を行う前にチェックすることは実績のある方法ですが、アプリケーションに大きな変更が必要な場合があります。関連するHTTPの仕組みについては、すべてプログラミング言語でかなり抽象化されています。あなたが気にする必要があるのは、「投稿後にリダイレクトする」ことだけです.PRGは、偶発的な「二重投稿」を防ぐためのベストプラクティスです。あなたは悪意のあるユーザーに関心を持っているので、深く掘り下げて多くのサーバーサイドの配管作業を行う必要があります。 –

    +0

    それを得ました。私は今、すべてのサーバーのものを書いているので、いくつかの選択肢がありますが、この方法を最初の防御として理解することは有用です。あなたの応答に感謝します。 – Ray

    関連する問題