jsp:forward
とredirect
の違いを説明してください。
それぞれの場合に何が起こっていますか?
redirectは、応答ステータスを302 [1]に設定し、Location
ヘッダーに新しいURLを設定して、ブラウザーに応答を送信します。次に、ブラウザは、http仕様に従って、新しいURLに別の要求を行います
転送は完全にサーバー上で行われます。サーブレットコンテナは、同じリクエストをターゲットURLに転送するだけで、ブラウザはそのことを知りません。したがって、新しいURLを処理するときに、同じリクエスト属性と同じリクエストパラメータを使用できます。また、ブラウザはURLが変更されたことを知りません(サーバー上で完全に発生したため)
[1]:これは、標準と矛盾する業界慣行の例です。 HTTP/1.0仕様(RFC 1945)では、クライアントが一時的なリダイレクトを実行する必要がありました(元の説明フレーズは「Moved Temporarily」でした)が、一般的なブラウザは302 See Seeの機能を実装しました302。したがって、HTTP/1.1では、2つの動作を区別するためにステータスコード303と307が追加されました。ただし、一部のWebアプリケーションおよびフレームワークは、302ステータスコードを303であるかのように使用します。 ソース
リダイレクトとフォワードの興味深い説明を聞いたことがあります。友達からのサービスが必要だと想像してください。どのサービスでもかまいません。あなたの友人があなたを助けることができないが、誰ができるかを知っていると仮定します。
「これは処理できませんが、誰が処理できるかはわかっています。ここに彼の電話番号があります。彼に電話してください。」
彼はあなたに「問題ない」と言ったらあなたの要求を先送りし、あなたの欲望の処理に他の人を巻き込むことについてあなたに通知せずにその人を自分で呼びます。その後、あなたの友人はあなたの願いを整理し、あなたにそれを送信した結果を取得します。
リダイレクトは、ブラウザを経由してブラウザが新しいリクエストを行うまで待機する必要があるため、フォワードと比較して遅くなり、リクエストスコープオブジェクトがリダイレクト後に使用できなくなることもあります。
リダイレクト:
転送:
これは、要求されたリソースをユーザーに単に表示するプロセスです。完全にサーバー側で発生します。
この投稿 は、Niceの実世界の例を使用して、転送とリダイレクトに関する非常に良い説明を提供します。
ミルクマンが来て、あなたの家であなたに毎月の支払いを求めます。ここで、家はコンテナであり、あなたはコンテナ内に存在するリソースです。ミルクマンはクライアントまたはブラウザです。
彼はあなたへの毎月の支払いを要求します。これはブラウザがリソースAに対して行うリクエストです。これはフォワードと呼ばれます。
牛乳屋にあなたの家の中で母親と話すように頼むか、牛乳屋に彼のオフィス(異なるドメイン)にいる父親と話すように頼むなら、これはリダイレクトと呼ばれます。
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| Forwards vs. | Redirects |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| ServletContext.getRequestDispatcher(location).forward(request,response) | httpServletResponse.sendRedirect(location) |
| Communication between pages directly | Communication b/w pages are indirectly by extra round trip from HTTP client |
| Communication happens within web-container | Communication happens outside web-container |
| Use same Request and Response Object | Use different Request and Response Object |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
リクエストを転送すると、
-要求および応答オブジェクトが転送されます。 -urlは変わりません。
リクエストを別のJSP /サーブレットにリダイレクトすると、
-requestおよびresponseオブジェクトは新しいオブジェクトに転送されません。 -Urlは新しいページのディレクトリに変更されます。