1

たとえば、Post Redirect Get パターンに関する興味深い記事が多数あります: http://www.theserverside.com/news/1365146/Redirect-After-Post

しかし、ここで素朴な疑問...

ユーザーが POST を実行し、GET にリダイレクトされた場合。ブラウザが GET を送信するだけでリフレッシュできれば問題ありません。わかりやすいです。しかし、GET の後に BACK ボタンを押してから更新を押すと、POST をもう一度押すことができますか? うん?

POST が再送信されないことを 100% 確実にする方法を理解しようとしています。

4

2 に答える 2

1

POST が再送信されないようにする方法の 1 つは、その投稿セッションに一意の識別子を関連付けることです。たとえば、ショッピング カートの場合、チェックアウトを開始するときに、そのプロセスの一意の ID を生成します。チェックアウトが完了したら (たとえば、POST が送信された場合)、使用できる ID からその ID を削除します。

フォームで一意のキーを生成することでこれを行うこともできます。フォームが送信された場合は、保存されている場所からそのキーを削除します。

<input type="hidden" name="key" value="<?php echo generateUniqueKey(); ?>" />

ここで、generateUniqueKey() 関数はテーブルをクエリして一意の ID を挿入し、ID を返します。フォームを処理しているページで、次のようにします。

<?php 
    $key = $_POST['key'];
    if (isKeyStillValid ($key)) {
        markKeyAsInvalid ($key);
        // Process form ...
    }
    else {
        die ("You have already submitted this form".);
    }
?>

isKeyStillValid() 関数がデータベースをチェックして、フォームで使用されているキーがまだ使用可能なキーであることを確認し、markKeyAsInvalid() 関数がデータベースからキーを削除します。

更新: これは、先ほど説明した内容を正確に含む、私が作成したばかりの例です。これは非常に単純な例であり、単純に SQL テーブルの自動インクリメント ID をキーとして使用していますが、例としては十分なはずです。現実的には、これよりももっと考え抜かれたものが必要になるでしょう。 http://alexloney.com/post/

于 2012-07-07T21:42:35.757 に答える
0

しかし、GET の後に BACK ボタンを押してから更新を押すと、POST をもう一度押すことができますか? うん?

うん。

ユーザーが [戻る] ボタンを使用すると、これが発生する可能性があります。パターンはそれに対して保護しません。元のフォームと同じページに結果が表示されるのを防ぐだけで、更新 (F5) によって再投稿が発生します。

POST が再送信されないことを 100% 確実にするにはどうすればよいでしょうか?

1 つの方法は、過去 X 分間に送信されたすべての値に対して投稿された値をチェックし、重複を破棄することです (意図的な重複を失うリスクがあります)。

于 2012-07-07T21:36:02.180 に答える