リダイレクト VS. フォーワード


はじめに


J2EEサーブレットアプリケーションで、処理中のページから別のページへ処理を移す場合は、次の2つの方法がある。

  • リダイレクト
    response.sendRedirect("遷移先のページ");
    
  • フォーワード
    application.getRequestDispatcher("転送先のページ").forward(request,response);
    
    ユーザからみると同じ動作であるが内部動作はまったく異なる。


内部動作の違い


ここは記述中



結果として発生すること


  • リダイレクトよりもフォワードの方がパフォーマンスが良い
    • リダイレクトがクライアントとサーバ間を2往復(ラウンドトリップ)する非効率な処理であるのに対して、フォワードは通常のリクエスト同様に1回のリクエスト/レスポンスで処理が完結します。これは、単純に2倍のトラフィックが発生するというだけのことではありません。リダイレクトによって発生した2回目のリクエストは、待ち行列の末尾に配置されるため、特にトラフィックの多いサーバにおいては、要求待ちによる遅延が発生する可能性があります。一方、フォワードは、1つのリクエスト処理内の連続したロジックとして処理されるため、こうした遅延の心配はありません。
  • フォワードはサーバ内部の転送にのみ使用できる
    • 遅延が起こらないからといって、ページの自動的な転移を常にフォワードで行えば良いというわけではありません。フォワードは、「サーバ内」で処理を転送するというその性質上、同一サーバ内ページ(クラス)間でしか利用することができません。外部のサーバ上のページに対して移動したいという場合には、リダイレクトを使用する必要があります。
  • リクエスト情報を引き継げるのはフォワードのみ
    • リダイレクトでは、ページA、Bへの要求はまったく独立した「2つの」リクエストとして扱われるため、リクエストパラメータやリクエスト属性などの情報を両者で共有することはできません。しかし、フォワードでは、ページA、Bの処理は「1つの」リクエスト処理として扱われるため、リクエストパラメータやリクエスト属性はすべて引き継がれます。

タグ:

リダイレクト
最終更新:2011年02月17日 17:50