サーブレットのリダイレクトとフォワード
1. 概要
時折、Javaサーブレットの最初のHTTPリクエストハンドラーは、リクエストを別のリソースに委任する必要があります。 これらの場合、リクエストをさらに転送するか、別のリソースにリダイレクトすることができます。
両方のメカニズムを使用して、それぞれの違いとベストプラクティスについて説明します。
2. Mavenの依存関係
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");
}
We use original response object to redirect this request to another URL:「/redirected”.
クライアントがhttp://localhost:8081/welcome?name=Dennisにリクエストを送信すると、リクエストはhttp://localhost:8081/redirected.にリダイレクトされます
Springのコンテキストでリダイレクトを実行する方法の詳細については、専用のarticle hereを参照してください。
5. 違い
どちらの場合も、パラメータ「name」に値を渡しました。 Simply put, forwarded requests still carry this value, but redirected requests don’t.
これは、リダイレクトでは、リクエストオブジェクトが元のオブジェクトと異なるためです。 それでもこのパラメーターを使用する場合は、HttpSessionオブジェクトに保存する必要があります。
サーブレットの転送とリダイレクトの主な違いのリストは次のとおりです。
Forward:
-
リクエストはサーバー側でさらに処理されます
-
クライアントは転送の影響を受けず、ブラウザのURLは同じままです
-
要求および応答オブジェクトは、転送後も同じオブジェクトのままになります。 リクエストスコープのオブジェクトは引き続き利用可能です
Redirect:
-
要求は別のリソースにリダイレクトされます
-
クライアントには、リダイレクト後にURLの変更が表示されます
-
新しいリクエストが作成されます
-
リダイレクトは通常、Post/Redirect/GetのWeb開発パターン内で使用されます
6. 結論
転送とリダイレクトは、ユーザーを異なるリソースに送信することに関するものですが、セマンティクスはまったく異なります。
これらの間の選択は簡単です。 前のスコープが必要な場合、またはユーザーに通知する必要はないが、アプリケーションが内部アクションthen use forwardingも実行したい場合。
スコープを破棄する場合、または新しいコンテンツが元のリクエストに関連付けられていない場合(ログインページへのリダイレクトやフォーム送信の完了など)、then use redirecting。
いつものように、サンプルコードはover on GitHubにあります。