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