1.概要

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

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

2. Mavenの依存関係

まず、Servlet Mavenの依存関係を追加しましょう。

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

最新バージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22javax.servlet%22%20AND%20a%3A%22javax.servlet-api%22]。

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にリダイレクトするためにオリジナルのレスポンスオブジェクトを使用します

クライアントが


http://localhost:8081/welcome?name

= Dennis

にリクエストを送信すると、リクエストは


http://localhost:8081/redirected

.

にリダイレクトされます。

Springのコンテキストでリダイレクトを行うことについてもっと知るためには、私達の専用リンクを見てください:/spring-redirect-and-forward[ここの記事]。

5.違い

どちらの場合も、パラメータ「

name

」に値を渡しました。簡単に言うと、転送されたリクエストにはまだこの値が含まれていますが、リダイレクトされたリクエストにはありません。**

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

HttpSession

オブジェクトに保存する必要があります。

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

  • 進む** :

  • リクエストはサーバー側でさらに処理されます

  • クライアントは転送の影響を受けません。ブラウザのURLは変わりません。

  • リクエストとレスポンスのオブジェクトは、その後も同じオブジェクトのままになります。

転送します。リクエストスコープオブジェクトはまだ利用可能です

  • リダイレクト** :

  • リクエストは別のリソースにリダイレクトされます

  • リダイレクト後、クライアントにURLの変更が表示されます。

  • 新しいリクエストが作成されました

  • リダイレクトは通常内で使用されます


Post/Redirect/Get

ウェブ開発パターン

6.まとめ

転送とリダイレクトはどちらもユーザーを異なるリソースに送信することですが、意味はまったく異なります。

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

、次に転送を使用します

範囲を破棄したり、新しいコンテンツが元の要求に関連付けられていない場合(ログインページへのリダイレクトやフォーム送信の完了など)、

リダイレクト

を使用します。

いつものように、サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-simple[over on GitHub]にあります。