Λ Takuya71 の日記 Λ

ここに記載の内容は個人的な見解で 勤務先、所属先には関連はございません。最近は scala に はまってます。認定スクラムマスター

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で相対パスが設定されていたときに
絶対パスに変換する場合の サーバ名として設定される値となる。