如何在 JAX-RS / Apache CXF 中设置主机 header
How to set the Host header in JAX-RS / Apache CXF
我正在尝试通过 HTTPS 访问服务,但由于网络设置受限,我正在尝试通过 ssh 隧道发出请求。
我使用如下命令创建隧道:
ssh -L 9443:my-service.com:443 sdt-jump-server
该服务只能通过 HTTPS 获得,它使用 self-signed 证书托管,并且位于使用主机名或显式主机 header 进行路由的 load-balancer 之后传入请求到适当的后端服务。
我可以使用 curl like
从我的本地系统调用端点
curl -k -H 'Host: my-service.com' https://localhost:9443/path
但是,当我尝试使用 JAX-RS 的 CXF 3.1.4 实现来发出完全相同的请求时,我似乎无法使其工作。我配置了一个 hostnameVerifier 以允许连接,下载了服务器的证书,并将其添加到我的信任库中。现在我可以连接了,但似乎 load-balancer 没有尊重我尝试设置的主机 header。
我有点迷茫,直到我设置了 -Djavax.net.debug
并看到传递的主机 header 实际上是 localhost
而不是我设置的值。如何让 CXF 尊重主机 header 我正在设置而不是使用来自 WebTarget 的 URL 的值?!
CXF 使用 HttpUrlConnection,因此您需要以编程方式设置系统属性
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
或在启动时:
-Dsun.net.http.allowRestrictedHeaders=true
另见
我正在尝试通过 HTTPS 访问服务,但由于网络设置受限,我正在尝试通过 ssh 隧道发出请求。
我使用如下命令创建隧道:
ssh -L 9443:my-service.com:443 sdt-jump-server
该服务只能通过 HTTPS 获得,它使用 self-signed 证书托管,并且位于使用主机名或显式主机 header 进行路由的 load-balancer 之后传入请求到适当的后端服务。
我可以使用 curl like
从我的本地系统调用端点curl -k -H 'Host: my-service.com' https://localhost:9443/path
但是,当我尝试使用 JAX-RS 的 CXF 3.1.4 实现来发出完全相同的请求时,我似乎无法使其工作。我配置了一个 hostnameVerifier 以允许连接,下载了服务器的证书,并将其添加到我的信任库中。现在我可以连接了,但似乎 load-balancer 没有尊重我尝试设置的主机 header。
我有点迷茫,直到我设置了 -Djavax.net.debug
并看到传递的主机 header 实际上是 localhost
而不是我设置的值。如何让 CXF 尊重主机 header 我正在设置而不是使用来自 WebTarget 的 URL 的值?!
CXF 使用 HttpUrlConnection,因此您需要以编程方式设置系统属性
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
或在启动时:
-Dsun.net.http.allowRestrictedHeaders=true
另见