現象
以下のようにRestTemplate
にURLのホストとは異なるHost
ヘッダを指定するとそのヘッダが無視される。
HttpHeaders headers = new HttpHeaders();
headers.set("Host", "www.example.com");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.exchange(
"http://httpbin.org/headers", HttpMethod.GET,
new HttpEntity<String>(null, headers), String.class);
原因
https://stackoverflow.com/questions/43223261/setting-host-header-for-spring-resttemplate-doesnt-work に書いてあるが、RestTemplate
の基底実装がHttpUrlConnection
の場合はこの挙動になる。詳しい事はリンク先に書いてあるが、セキュリティ上の理由というかRFC準拠でこうなっている(らしい)
対策
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
あるいは
-Dsun.net.http.allowRestrictedHeaders=true
もしくは基底実装にApache HttpComponentsを使用する。