HttpServletRequest#getRequestURL()とforward
Javadocによると、HttpServletRequest#getRequestURL()は
クライアントが要求を作成するために使用した URL を再構築します。
となっているので、常にリクエスト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から)。
- javax.servlet.forward.request_uri
- javax.servlet.forward.context_path
- javax.servlet.forward.servlet_path
- javax.servlet.forward.path_info
- javax.servlet.forward.query_string