131

forward()との概念的な違いは何sendRedirect()ですか?

4

9 に答える 9

169

LocationWeb開発の世界では、「リダイレクト」という用語は、クライアントが新しいGETリクエストを送信する必要がある新しいURLを含むヘッダーのみを含む空のHTTP応答をクライアントに送信する行為です。だから基本的に:

  • クライアントはHTTPリクエストをに送信しますsome.jsp
  • Location: other.jspサーバーはヘッダー付きのHTTP応答を送り返します
  • クライアントはHTTPリクエストをに送信しますother.jsp(これはブラウザのアドレスバーに反映されます!)
  • サーバーは、コンテンツを含むHTTP応答を送り返しますother.jsp

Webブラウザの組み込み/アドオン開発者ツールセットを使用して追跡できます。Chrome / IE9 / FirebugでF12を押し、[ネットワーク]セクションをチェックして確認します。

まさに上記はによって達成されsendRedirect("other.jsp")ます。はRequestDispatcher#forward()リダイレクトを送信しません。代わりに、ターゲットページのコンテンツをHTTP応答として使用します。

  • クライアントはHTTPリクエストをに送信しますsome.jsp
  • サーバーは、コンテンツを含むHTTP応答を送り返しますother.jsp

ただし、元のHTTPリクエストがであったためsome.jsp、ブラウザのアドレスバーのURLは変更されません。また、コントローラービハインドで設定されたリクエスト属性は、some.jspで使用できますother.jsp基本的に、クライアントに新しいHTTPリクエストを作成するように強制しているため、リダイレクト中にこれは発生しません。これにより、すべての属性を含めるother.jspと元のリクエストが破棄されます。some.jsp


これRequestDispatcherは、MVCパラダイムや、JSPを直接アクセスから隠したい場合に非常に役立ちます。/WEB-INFJSPをフォルダに入れServletて、リクエストを制御、前処理、後処理するを使用できます。フォルダ内のJSPには、/WEB-INFURLから直接アクセスすることはServletできませんが、を使用してアクセスできますRequestDispatcher#forward()

たとえば、JSPファイルを/WEB-INF/login.jspとにマップすることができます。LoginServletこれはのにマップされます。を呼び出すと、サーブレットが呼び出されます。そこで前処理を行い、最後に次のようにリクエストを転送できます。url-pattern/loginhttp://example.com/context/logindoGet()

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

フォームを送信するときは、通常、以下を使用しますPOST

<form action="login" method="post">

このようにしてサーブレットが呼び出され、そこで後処理doPost()を行うことができます(検証、ビジネスロジック、ユーザーのログインなど)。

エラーがある場合は、通常、リクエストを同じページに転送して、入力フィールドの横にエラーを表示します。これにはを使用できますRequestDispatcher

が成功した場合、POST通常はリクエストをリダイレクトして、ユーザーがリクエストを更新したときにリクエストが再送信されないようにします(たとえば、F5キーを押すか、履歴に戻ります)。

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
    request.setAttribute("error", "Unknown login, please try again."); // Set error.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}

したがって、リダイレクトGETは、指定されたURLで新しいリクエストを実行するようにクライアントに指示します。リクエストを更新すると、リダイレクトされたリクエストのみが更新され、最初のリクエストは更新されません。これにより、「二重送信」や混乱、ユーザーエクスペリエンスの低下を回避できます。これはPOST-Redirect-GETパターンとも呼ばれます。

参照:

于 2010-01-12T11:49:54.843 に答える
113

requestDispatcher --forward()メソッド

  1. このメソッドを使用するforwardと、リクエストは同じサーバー内の別のリソースに転送され、さらに処理されます。

  2. の場合forward、Webコンテナはすべての処理を内部で処理し、クライアントやブラウザは関与しません。

  3. forwardオブジェクトでが呼び出されると、requestDispatcherリクエストオブジェクトとレスポンスオブジェクトが渡されるため、リクエストを処理する新しいリソースに古いリクエストオブジェクトが存在します。

  4. 視覚的には、転送されたアドレスを確認できません。透過的です。

  5. このforward()メソッドの使用は。よりも高速ですsendRedirect

  6. forwardを使用してリダイレクトし、新しいリソースで同じデータを使用する場合request.setAttribute()は、リクエストオブジェクトを使用できるので使用できます。

SendRedirect

  1. の場合sendRedirect、リクエストは別のリソース、別のドメイン、または別のサーバーに転送され、さらに処理されます。

  2. を使用するsendRedirectと、コンテナはリクエストをクライアントまたはブラウザに転送するため、メソッド内で指定されたURLsendRedirectは、クライアントへの新しいリクエストとして表示されます。

  3. 呼び出しの場合sendRedirect、ブラウザによって新しい要求として扱われるため、古い要求オブジェクトと応答オブジェクトは失われます。

  4. アドレスバーに、リダイレクトされた新しいアドレスが表示されます。透明ではありません。

  5. sendRedirect完全に新しいリクエストが作成され、古いリクエストオブジェクトが失われるため、1回の追加のラウンドトリップが必要になるため、速度が低下します。2つのブラウザリクエストが必要です。

  6. ただし、sendRedirectでは、新しいリソースに同じデータを使用する場合は、データをセッションに保存するか、URLとともに渡す必要があります。

どちらがいいですか?

それは、どちらの方法がより有用であるかというシナリオに依存します。

制御を新しいサーバーまたはコンテキストに転送する必要があり、それが完全に新しいタスクとして扱われる場合は、に進みsendRedirectます。一般に、ブラウザがWebページをリロードしたときに操作を安全に繰り返すことができ、結果に影響を与えない場合は、転送を使用する必要があります。

ソース

于 2013-10-10T07:04:44.850 に答える
22

このRequestDispatcherインターフェースでは、サーバー側の転送/インクルードを実行できますsendRedirect()が、クライアント側のリダイレクトは実行できます。クライアント側のリダイレクトでは、サーバーは(一時的なリダイレクト)のHTTPステータスコードを送り返します。これにより、Webブラウザーは、リダイレクトされた場所にあるコンテンツに対して302まったく新しいHTTP要求を発行します。GET対照的に、RequestDispatcherインターフェースを使用する場合、新しいリソースへのインクルード/転送は完全にサーバー側で処理されます。

于 2010-01-12T06:26:40.663 に答える
14

forward()メソッドとsendRedirect()メソッドの主な重要な違いは、forward()の場合、リダイレクトはサーバー側で発生し、クライアントには表示されないことですが、sendRedirect()の場合、リダイレクトはクライアント側で発生し、表示されます。クライアントに。

ここに画像の説明を入力してください

于 2018-07-19T13:24:37.643 に答える
5

やりたいことに応じて、これらの方法のいずれかが「より良い」、つまりより適切な場合があります。

ブラウザにラウンドトリップせずに別のページからデータを取得する限り、サーバー側のリダイレクトは高速です。ただし、ブラウザに表示されるURLは元のアドレスのままであるため、そこに少し矛盾が生じています。

クライアント側のリダイレクトは、完全に異なるサーバーに送信したり、プロトコルを変更したり(HTTPからHTTPSに変更したり)、またはその両方を行うことができる限り、より用途が広くなります。そして、ブラウザは新しいURLを認識しています。ただし、サーバーとクライアントの間で余分なやりとりが必要です。

于 2010-01-12T06:39:53.917 に答える
3

SendRedirect()サーバー間でコンテンツを検索します。コンテンツのURLを送信してブラウザを親密にする必要があるため、低速です。次に、ブラウザは同じサーバー内または別のサーバー内のコンテンツに対する新しいリクエストを作成します。

RquestDispatcherサーバー内のコンテンツを検索するためのものだと思います。そのサーバー側のプロセスであり、SendRedirect()メソッドと比較して高速です。ただし、必要な日付やコンテンツを検索しているサーバーをブラウザに通知することはなく、[URL]タブでURLを変更するようにブラウザに要求することもありません。そのため、ユーザーにほとんど不便をかけません。

于 2013-01-08T06:54:29.867 に答える
1

制御を別のドメインに移す必要がある場合、またはタスクの分離を実現する必要がある場合は、技術的にリダイレクトを使用する必要があります。

たとえば、支払いアプリケーションでは、最初にPaymentProcessを実行してから、displayPaymentInfoにリダイレクトします。クライアントがブラウザを更新すると、displayPaymentInfoのみが再度実行され、PaymentProcessは繰り返されません。ただし、このシナリオでフォワードを使用すると、PaymentProcessとdisplayPaymentInfoの両方が順番に再実行されるため、データが不整合になる可能性があります。

他のシナリオでは、sendRedirectよりも高速であるため、forwardを使用すると効率的です。

于 2014-06-20T09:03:16.533 に答える
0

Request Dispatcherは、Webリソースから別のWebリソースに要求または応答をディスパッチするために使用されるインターフェースです。主に2つの方法が含まれています。

  1. request.forward(req,res):このメソッドは、あるWebリソースから別のリソースにリクエストを転送するために使用されます。つまり、あるサーブレットから別のサーブレットへ、またはあるWebアプリケーションから別のWebアプリケーションへ。

  2. response.include(req,res):このメソッドは、あるサーブレットから別のサーブレットへの応答を含めて使用されます

注:Request Dispatcherを使用することで、同じサーバーにリクエストまたはレスポンスを転送または含めることができます。

request.sendRedirect():これを使用することで、異なるサーバー間でリクエストまたはレスポンスを転送または含めることができます。これでは、クライアントはページのリダイレクト中に情報を取得しますが、上記のプロセスではクライアントは情報を取得しません

于 2013-06-24T09:32:51.723 に答える
0

Forward(ServletRequest request, ServletResponse response)との違いsendRedirect(String url)

前方():

  1. forward()メソッドはサーバー側で実行されます。
  2. リクエストは、同じサーバー内の他のリソースに転送されます。
  3. forward ()メソッドはサーブレットコンテナによって提供されるため、クライアントの要求プロトコルに依存しません。
  4. リクエストはターゲットリソースによって共有されます。
  5. このメソッドで使用される呼び出しは1つだけです。
  6. サーバー内で使用できます。
  7. 転送されたメッセージは表示されません。透過的です。
  8. このforward()方法は方法よりも高速ですsendRedirect()
  9. インターフェイスで宣言されRequestDispatcherます。

sendRedirect():

  1. sendRedirect()メソッドはクライアント側で実行されます。
  2. リクエストは、別のサーバーの他のリソースに転送されます。
  3. sendRedirect()メソッドはHTTPで提供されるため、HTTPクライアントでのみ使用できます。
  4. 宛先リソースに対して新しい要求が作成されます。
  5. 2つの要求と応答の呼び出しが消費されます。
  6. サーバーの内外で使用できます。
  7. リダイレクトされたアドレスを確認できますが、透過的ではありません。
  8. 新しいリクエストが作成されると古いリクエストオブジェクトが失われるため、sendRedirect()メソッドは遅くなります。
  9. HttpServletResponseで宣言されています。
于 2019-05-24T10:25:49.400 に答える