Как установить заголовок хоста в JAX-RS / Apache CXF - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь получить доступ к сервису через HTTPS, но из-за ограниченных сетевых настроек я пытаюсь сделать запрос через туннель ssh.

Я создаю туннель с помощью команды, подобной:

ssh -L 9443: my-service.com: 443 sdt-jump-server

Служба доступна только через HTTPS, она размещена с самозаверяющим сертификатом и являетсяза балансировщиком нагрузки, который использует либо имя хоста, либо явный заголовок хоста для маршрутизации входящих запросов в соответствующую серверную службу.

Я могу вызывать конечную точку из моей локальной системы, используя curl, например

curl -k -H 'Host: my-service.com' https://localhost:9443/path

Однако, когда я пытаюсь использовать реализацию JAX-RS в CXF 3.1.4, чтобыта же самая просьба, я не могу заставить ее работать.Я настроил hostnameVerifier, чтобы разрешить соединение, загрузил сертификат сервера и добавил его в мое хранилище доверенных сертификатов.Теперь я могу подключиться, но похоже, что балансировщик нагрузки не соблюдает заголовок хоста, который я пытаюсь установить.

Я немного растерялся, пока не установил -Djavax.net.debug и не увидел, что хостпереданный заголовок был на самом деле localhost, а не значение, которое я установил.Как заставить CXF соблюдать заданный мной заголовок Host вместо значения из URL-адреса WebTarget?!

1 Ответ

0 голосов
/ 02 июня 2018

CXF использует HttpUrlConnection, поэтому вам необходимо установить системное свойство программно

System.setProperty("sun.net.http.allowRestrictedHeaders", "true")

или при запуске:

-Dsun.net.http.allowRestrictedHeaders=true

См. Также Как перезаписать http-заголовок "Хост "в HttpURLConnection?

...