如何在 JAX-RS / Apache CXF 中设置 Host 标头



我正在尝试通过HTTPS访问服务,但由于网络设置受限,我正在尝试通过ssh隧道发出请求。

我使用如下命令创建隧道:

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

该服务仅通过 HTTPS 提供,其托管使用自签名证书,并且位于负载均衡器后面,该负载均衡器使用主机名或显式 Host 标头将传入请求路由到相应的后端服务。

我能够使用 curl 从我的本地系统调用端点,例如

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

但是,当我尝试使用 JAX-RS 的 CXF 3.1.4 实现来发出相同的请求时,我似乎无法使其工作。我配置了一个主机名验证程序以允许连接,下载了服务器的证书,并将其添加到我的信任库中。现在我可以连接了,但负载均衡器似乎没有遵循我尝试设置的 Host 标头。

我迷茫了一会儿,直到我设置-Djavax.net.debug并看到正在传递的 Host 标头实际上是localhost而不是我设置的值。如何使 CXF 遵循我正在设置的主机标头,而不是使用 WebTarget URL 中的值?!

CXF 使用 HttpUrlConnection,因此您需要以编程方式设置系统属性

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

或在启动时:

-Dsun.net.http.allowRestrictedHeaders=true

参见 如何在 HttpURL 中覆盖 http-header "Host"?

最新更新