WEB-INF の下にあるこれらのページには、 の forward メソッドを使用してアクセスできますRequestDispatcher
。何が問題なのsendRedirect
ですか?
3 に答える
以下のページWEB-INF
は、Web アプリケーションの外部からはアクセスできません。
現在、 を使用しているため、クライアントによって新しいリクエストが作成されるため、リクエストは実際にはブラウザから送信されるため、 へのパスをHttpServletResponse#sendRedirect()
含めることはできません。WEB-INF
sendRedirect
の場合RequestDispatcher
、メソッド -forward()
およびinclude()
は、クライアントに新しいリクエストを作成するように要求するのではなく、同じリクエストを使用して、おそらくServlet Controllerから別のページに転送/インクルードします。そのため、Web アプリケーション内からのみアクセスしているため、の下にあるファイルへのパスを指定できます。WEB-INF
RequestDispatcher
forward メソッドは、リクエストの制御を別のサーブレットまたは jsp に渡しますが、クライアント ブラウザへのリクエスト ディスパッチについては何も通知しません。したがって、リクエストのディスパッチは完全にサーバー側で行われるため、パスを指定できます
sendRedirect
このメソッドは、リクエストのそれ以上の処理を停止し、HTTP ステータス コード「301」と、クライアント ブラウザにリダイレクトされる場所の URL をレスポンス ヘッダーで送信します。サーバーは、リダイレクト関連の HTTP ヘッダーをクライアント ブラウザーに送信した後、この要求を制御できません。クライアント ブラウザは http ステータス 301 を確認し、サーバーによって設定された「Location」http ヘッダーの URL に新しいリクエストを送信する必要があることを認識します。クライアント ブラウザは新しい URL に新しいリクエストを送信し、それは別の通常のリクエストとしてサーバーによって処理されます。したがって、sendRedirect はクライアント ブラウザを介して処理されるため、パスの指定は機能しません。
WEB-INF
directory は Web アプリケーションの非公開領域であるため、 directory 配下のファイルWEB-INF
は、URL を指定してブラウザーから直接アクセスすることはできません。Web コンテナは、このディレクトリのコンテンツを提供しません。ただし、WEB-INF
ディレクトリの内容は、アプリケーション内のクラス/サーブレットからアクセスできます。
sendRedirect()
新しいブラウザを作成しますrequest
。リダイレクトは、ヘッダーをブラウザー/クライアントに送り返します。このヘッダーには、ブラウザによってリダイレクトされるリソース URL が含まれています。次に、ブラウザは指定された URL に対して新しいリクエストを開始します。
RequestDispatcher
のようなメソッドはinclude()/forward()
内部で動作します。呼び出しが行われた場所からサーバー内で利用可能なリソースを含め/転送します。この制御の移行はコンテナーによって内部的に行われ、ブラウザー/クライアントは関与しません。
アプリケーション階層内に「WEB-INF」という名前の特別なディレクトリが存在します。このディレクトリには、アプリケーションのドキュメント ルートにない、アプリケーションに関連するすべてのものが含まれます。WEB-INF ノードのほとんどは、アプリケーションのパブリック ドキュメント ツリーの一部ではありません。WEB-INF/lib ディレクトリにある JAR ファイルの METAINF/ リソースにパッケージ化された静的リソースと JSP を除き、WEB-INF ディレクトリに含まれるその他のファイルは、コンテナによってクライアントに直接提供されることはありません。ただし、WEB-INF ディレクトリの内容は、ServletContext で getResource および getResourceAsStream メソッド呼び出しを使用してサーブレット コードに表示され、RequestDispatcher 呼び出しを使用して公開される場合があります。