Servlet で forward した後に元のリクエストURIを取得する


forward 前のリクエストURI取得

HttpServletRequest.getAttribute() から取得できる。

HttpServletRequest request = //...
String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");

なお、forward されていない場合は null が返るため、概ね以下のようになる。

String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
uri = Objects.isNull(uri) ? request.getRequestURI() : uri;


Forwarded Request Parameters

サーブレット仕様は以下。

RequestDispatcher.forward() により、他のサーブレットから呼び出された後で、元のリクエストパスにアクセスできます(getNamedDispatcher() メソッドを使用して取得したサーブレットを除く)。

jakarta.servlet.forward.mapping
jakarta.servlet.forward.request_uri
jakarta.servlet.forward.context_path
jakarta.servlet.forward.servlet_path
jakarta.servlet.forward.path_info
jakarta.servlet.forward.query_string

これらの属性値は、最初のサーブレットに渡された HttpServletRequest の メソッド getRequestURI, getContextPath, getServletPath, getPathInfo, getQueryString と等しくなる必要がる。

これらの属性には、転送されたサーブレットからリクエストオブジェクトの getAttribute() を介してアクセス可能できる。 複数のフォワードとそれに続くインクルードが呼び出される状況下でも、常に元のリクエストの情報を反映しなければならない。

転送されたサーブレットが getNamedDispatcher() メソッドによって取得された場合、これらの属性は設定されてはならない。


インクルードされた場合も同様に HttpServletRequest.getAttribute() で以下を指定することで、インクルード前の元のリクエストの内容にアクセスできる。

jakarta.servlet.include.mapping
jakarta.servlet.include.request_uri
jakarta.servlet.include.context_path
jakarta.servlet.include.servlet_path
jakarta.servlet.include.path_info
jakarta.servlet.include.query_string


パスの取得

HttpServletRequest メソッド Forwarded Request Parameters 説明
getRequestURI() jakarta.servlet.forward.request_uri URL のプロトコル名からクエリ文字列まで
getContextPath() jakarta.servlet.forward.context_path リクエスト URI のコンテキスト
getServletPath() jakarta.servlet.forward.servlet_path サーブレットへのパス (CGI 変数 SCRIPT_NAME)
getPathInfo() jakarta.servlet.forward.path_info URL に関連付けられた追加のパス情報(CGI 変数 PATH_INFO)
getQueryString() jakarta.servlet.forward.query_string URL のパスの後に含まれるクエリ文字列(CGI 変数 QUERY_STRING)

具体例で見た場合、以下となる。

https://server/contextroot/faces/foo/bar.xhtml?key=val

  • getRequestURI() : /contextroot/faces/foo/bar.xhtml
  • getContextPath() : /contextroot
  • getServletPath() : /faces(url-patternに一致した部分)
  • getPathInfo() : /foo/bar.xhtml
  • getQueryString() : key=val