1. 概要

場合によっては、Javaサーブレットの最初のHTTPリクエストハンドラがリクエストを別のリソースに委任する必要があります。 このような場合、リクエストをさらに転送するか、別のリソースにリダイレクトすることができます。

両方のメカニズムを使用して、それぞれの違いとベストプラクティスについて説明します。

2. Mavenの依存関係

まず、サーブレットMavenの依存関係を追加しましょう。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
</dependency>

最新バージョンはここにあります。

3. 前方

さあ、すぐに始めて、簡単な前進を行う方法を見てみましょう。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    RequestDispatcher dispatcher = getServletContext()
      .getRequestDispatcher("/forwarded");
    dispatcher.forward(req, resp);
}

親サーブレットからRequestDispatcher参照を取得し、それを別のサーバーリソースにポイントします。

簡単に言えば、これはリクエストを転送します。

クライアントがhttp:// localhost:8081 / hello?name = Dennis にリクエストを送信すると、このロジックが実行され、リクエストは「 /forwarded」に転送されます。

4. リダイレクト

転送の概念を理解したので、リダイレクトの簡単なスニペットを見てみましょう。

protected void doGet(HttpServletRequest req, HttpServletResponse resp){
    resp.sendRedirect(req.getContextPath() + "/redirected");
}

元の応答オブジェクトを使用して、このリクエストを別のURLにリダイレクトします:「/redirected」。

クライアントがhttp:// localhost:8081 / welcome?name = Dennis にリクエストを送信すると、リクエストは http:// localhost:8081/redirectedにリダイレクトされます。

Springのコンテキストでリダイレクトを実行する方法の詳細については、専用の記事を参照してください。

5. 違い

どちらの場合も、パラメータ「name」に値を渡しました。 簡単に言えば、転送されたリクエストには引き続きこの値が含まれますが、リダイレクトされたリクエストには含まれません。

これは、リダイレクトを使用すると、リクエストオブジェクトが元のオブジェクトと異なるためです。 それでもこのパラメータを使用したい場合は、HttpSessionオブジェクトに保存する必要があります。

サーブレットの転送とリダイレクトの主な違いのリストは次のとおりです。

転送

  • リクエストはサーバー側でさらに処理されます
  • クライアントは転送の影響を受けず、ブラウザのURLは同じままです
  • リクエストオブジェクトとレスポンスオブジェクトは、転送後も同じオブジェクトのままになります。 リクエストスコープオブジェクトは引き続き利用可能です

リダイレクト

  • リクエストは別のリソースにリダイレクトされます
  • クライアントは、リダイレクト後にURLの変更を確認します
  • 新しいリクエストが作成されます
  • リダイレクトは通常、 Post / Redirect / GetWeb開発パターン内で使用されます

6. 結論

転送とリダイレクトはどちらも、セマンティクスがまったく異なりますが、ユーザーを異なるリソースに送信することを目的としています。

これらの間の選択は簡単です。 前のスコープが必要な場合、またはユーザーに通知する必要はないが、アプリケーションが内部アクションを実行したい場合は、転送を使用します。

スコープを破棄する場合、または新しいコンテンツが元のリクエストに関連付けられていない場合(ログインページへのリダイレクトやフォーム送信の完了など)は、次にリダイレクトを使用します。

いつものように、サンプルコードはGitHubにあります。