HttpServletRequest#getRequestURL()とforward

Javadocによると、HttpServletRequest#getRequestURL()は

クライアントが要求を作成するために使用した URL を再構築します。

- JavaTM 2 Platform, Enterprise Edition, v 1.3.1 API 仕様

となっているので、常にリクエストURLを返すのかと思いきや、forwardの時はそうではない(Tomcat 5.5.26で確認)。

例を挙げる。

request.jsp:

<forward page="/forward.jsp" />

forward.jsp:

<p>HttpServletRequest#getRequestURL() = <%= request.getRequestURL().toString() %></p>

http:// localhost:8080/request.jspをリクエストすると、「HttpServletRequest#getRequestURL() = http:// localhost:8080/request.jsp」ではなく「HttpServletRequest#getRequestURL() = http:// localhost:8080/forward.jsp」と表示される。

通常forwardされるとHttpServletRequestが返すパス情報は軒並みforward先の情報に差し替えられてしまうが、getRequestURL()も例外ではないということである。

なお、forward前のパス情報はHttpServletRequest#getAttribute()を使って次のキーで取り出すことができる(多分ServletAPI2.4から)。