との違いを教えてjsp:forward
くださいredirect
。
それぞれのケースで何が起こっているのですか?
7 に答える
リダイレクトは、応答ステータスを 302 [1] に設定し、新しい URL を
Location
ヘッダーに設定して、応答をブラウザーに送信します。次に、ブラウザーは、http 仕様に従って、新しい URL に対して別の要求を行います。forward は完全にサーバー上で発生します。サーブレット コンテナは、同じリクエストをターゲット URL に転送するだけで、ブラウザはそれを認識しません。したがって、新しい URL を処理するときに、同じ要求属性と同じ要求パラメーターを使用できます。また、ブラウザーは URL が変更されたことを認識しません (完全にサーバー上で発生したため)。
[1]: これは、標準に反する業界慣行の例です。HTTP/1.0 仕様 (RFC 1945) では、クライアントが一時的なリダイレクトを実行する必要がありました (元の記述フレーズは「Moved Temporarily」でした)。したがって、HTTP/1.1 は、2 つの動作を区別するためにステータス コード 303 と 307 を追加しました。ただし、一部の Web アプリケーションおよびフレームワークでは、302 ステータス コードを 303 のように使用します。ソース
また、リダイレクトは、ブラウザを通過してブラウザが新しいリクエストを行うのを待つ必要があるため、転送に比べて遅くなります。そのため、リダイレクト後にリクエストスコープオブジェクトが使用できなくなります。
この投稿では、実際の例を使用して、転送とリダイレクトについて非常によく説明しています。
牛乳屋さんが来て、あなたの家に毎月の支払いを求めてきます。ここで家はコンテナであり、あなたはコンテナに存在するリソースです。ミルクマンはクライアントまたはブラウザです。
彼はあなたに月々の支払いを要求します。これは、ブラウザーがリソース A に対して行った要求です。家の中に入り、母親 (同じコンテナー内の別のリソース B) に現金を要求し、戻ってきて牛乳屋に届けるとします。これはフォワードと呼ばれます。
牛乳配達人に家の中で母親と話すように頼んだり、牛乳配達人に彼のオフィス (別のドメイン) にいる父親と話すように頼んだりする場合、これはリダイレクトと呼ばれます。
リクエストを転送すると、
-リクエストとレスポンスのオブジェクトが転送されます。-url は同じままです。
リクエストを別の JSP/サーブレットにリダイレクトすると、
-request オブジェクトと response オブジェクトは新しいオブジェクトに転送されません。-URL が新しいページのディレクトリに変更されます。