post メソッド内からリクエストを転送すると、確認アラートが表示され、「情報を再送信しないとページを更新できません」というメッセージが表示されます。ただし、get メソッドから転送が行われた場合、このアラート ボックスは表示されません。
理由は何ですか ?助けてください。
post メソッド内からリクエストを転送すると、確認アラートが表示され、「情報を再送信しないとページを更新できません」というメッセージが表示されます。ただし、get メソッドから転送が行われた場合、このアラート ボックスは表示されません。
理由は何ですか ?助けてください。
GET リクエストの URL にこれらのパラメータが含まれているためです (たとえば、URL は で終わります
?param1=foo¶m2=bar
)。通常、GET 要求には、サーバーの状態を変更する機密データやアクションは含まれません。URL から、何を送信しているかがわかります。
POST の場合、パラメーターは「非表示」になり、HTTP 要求の一部としてバックグラウンドで送信され、URL を見ても確認できません。これらのパラメーターはサーバーの状態を変更し、同じデータが 2 回送信された場合に問題が発生する可能性があります (たとえば、Web ストアから何かを誤って 2 回購入した場合など)。ブラウザは、再送信することに気付いていない場合に備えて通知します。
HTTP 仕様では、POST は非べき等の要求を対象としているため、サーバーの状態を変更するため (たとえば、新しい製品をカテゴリに追加することによって)、要求が再送信された場合に再度変更されます。 (たとえば、そのカテゴリに新しい製品が作成されます)。
一方、GET はべき等な要求を対象としています。たとえば、Google 検索はべき等です。同じものを 2 回検索しても、サーバー上で何も変更されず、同じ要求を再送信しても不要な影響はありません。
ブラウザーは、Web アプリケーションがこの規則を尊重することを期待しているため、POST 要求を再送信する前に、この望ましくない副作用についてユーザーに警告します。
通常のプラクティスは、post-redirect-getパターンに従って、この迷惑なポップアップや望ましくない副作用なしに、投稿後にユーザーが更新できるようにすることです。