検索

キーワード


【Webアプリケーション】リダイレクトとフォワードは何が違う?

  • 公開日:2020-10-29 17:57:57
  • 最終更新日:2020-11-13 21:30:00
【Webアプリケーション】リダイレクトとフォワードは何が違う?

こんにちは。エンジニアの新田です!

ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。

今回は、Java Servletのリダイレクトとフォワードの違いについて解説します。

Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!

関連記事:【Java】Webアプリケーションとは? 【Java】サーブレット(Java Servlet)


リダイレクトとフォワード

Java Servlet で、処理中のページから別のページに移動させる方法として、「リダイレクト」または「フォワード」させる方法があります。

【リダイレクト】

response.sendRedirect("遷移先のページ");

【フォワード】

RequestDispatcher dispatcher = request.getRequestDispatcher("転送先のページ");
dispatcher.forward(req, resp);


どちらも指定されたページに移動することができますが、内部的な挙動は異なります。

表面上は同じように見えますが、Webアプリケーション開発ではこれらの違いをしっかりと把握しておく必要があります。




リダイレクト

リダイレクトの場合、クラアイアントが商品Aのページを要求すると、サーバが商品A2のページを要求する指示をクライアントに戻します。

これによって、クライアントは自動的に商品A2のページを要求し、結果として商品A2のページがクライアントに戻されます。(※商品Aのページと商品A2のページは、必ずしも同一サーバのページとは限りません。

サーバからクライアントに異なるページにアクセスする要求を返すことで別のページへの遷移を実現しています。


リダイレクトの動作イメージ



フォワード

フォワードの場合、クライアントが商品Aのページを要求すると、サーバ内で商品Aのページから商品A2のページへ処理が移送され、商品A2のページが応答として戻されます。(※商品Aのページと商品A2のページは、必ず同一サーバ上のページである必要があります

サーバ内で商品A2のページに処理を転送し、商品A2のページを結果としてクライアントへ返すことでページ遷移を実現しています。


フォワードの動作イメージ



まとめ(挙動の違い)

リダイレクトよりもフォワードの方がパフォーマンスが良い

リダイレクトがクライアントとサーバ間を2往復(ラウンドトリップ)する非効率な処理なのに対して、フォワードは通常のリクエスト同様に1回のリクエスト/レスポンスで処理が完結します。

これは、単純に2倍のトラフィックが発生するというだけのことではありません。

リダイレクトによって発生した2回目のリクエストは、キューの末尾に配置されるため、アクセス数の多いサーバにおいては、要求待ちによる遅延が発生する可能性があります。

一方、フォワードは、1つのリクエストを処理する連続したロジックとして動作するため、こうした遅延の心配はありません。


フォワードはサーバ内部の転送にのみ使用できる

パフォーマンスが良いからといって、ページの自動的な遷移を全てフォワードで行えば良いというわけではありません。

フォワードは、「サーバ内」で処理を転送するという性質上、同一サーバ内ページ(クラス)間でしか利用することができません。

外部サーバのページに移動したいという場合は、リダイレクトを使用する必要があります。



リクエスト情報を引き継げるのはフォワードのみ

リダイレクトでは、「商品A」ページ、「商品A2」ページへの要求はまったく独立した「2つの」リクエストとして扱われるため、リクエスト情報を両者で共有することはできません。

しかし、フォワードでは、「商品A」ページ、「商品A2」ページの処理は「1つの」リクエスト処理として扱われるため、リクエスト情報をすべて引き継ぐことができます。




このようにリクエストとフォワードは、表面上は同じような動きをしているように見えますが、内部的には全くといっていいほど異なる挙動となっている事が分かったと思います。

Webアプリケーションの構築においてもその違いを十分に意識して使い分けるようにしましょう。



関連記事:【Java】Webアプリケーションとは? 【Java】サーブレット(Java Servlet)





【著者】

新田

JavaメインのWebアプリケーション開発に多く携わっています。
Javaの基本的な部分の紹介や、これまで経験したシステム開発手法、新しい技術についても紹介していこうと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様