Servlet で redirect した時の location ヘッダにセットされる ホスト名ってどうなっているのか
Servlet で redirect した時の location ヘッダにセットされる ホスト名ってどうなっているのか
Servlet では HttpServletResponse.sendRedirect(location) メソッド使ってリダイレクトできますが、 この location に相対パスを設定した場合でも
location ヘッダには 絶対パスが出力されます。 この時のホスト名は なんの情報から設定されるのだろうか? という疑問
Tomcat7.0 の ソースで調べてみた。
Response.java をみると sendRedirect(String location) があり、この中で toAbsolute が呼ばれていて、ここで 相対パス -> 絶対パスへの変換がされているようだ
... protected String toAbsolute(String location) { ... String scheme = request.getScheme(); String name = request.getServerName(); int port = request.getServerPort(); try { redirectURLCC.append(scheme, 0, scheme.length()); redirectURLCC.append("://", 0, 3); redirectURLCC.append(name, 0, name.length()); ...
この中で request.getServerName() によって サーバ名が取得されている。
getServerName() は HOST ヘッダの値から サーバ名を取得してる
どうやら リクエストのHOSTヘッダに指定されている値を サーバ名として使用しているようである。
ってことは http://server1.hogehoge.local/ のようなリクエストの場合は
HOSTヘッダには server1.hogehoge.local が設定されるので この値が sendRedirectで相対パスが設定されていたときに
絶対パスに変換する場合の サーバ名として設定される値となる。