【问题标题】:How to set the Host header in JAX-RS / Apache CXF如何在 JAX-RS / Apache CXF 中设置主机标头
【发布时间】:2018-06-02 13:04:41
【问题描述】:

我尝试通过 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 并看到传递的主机标头实际上是localhost 而不是我设置的值之前,我迷失了一点。如何让 CXF 尊重我设置的 Host 标头,而不是使用 WebTarget 的 URL 中的值?!

【问题讨论】:

  • 您使用的是 WebClient 还是标准化的 JAX-RS 客户端?顺便提一句。请至少使用最新的 3.1.x 版本,3.1.4 已过时。
  • 我正在使用标准化客户端 (ClientBuilder.newBuilder()),并且我正在使用以下内容设置标题:client.target("https://localhost:9443/").path("path").request(mimeType).header("Host","my-service.com")
  • 此外,更新到 3.1.15 似乎对这种特殊行为没有影响。也许它的ssh隧道重写了主机头而不是CXF?但是在那种情况下javax.net.debug=all 会接受吗?

标签: ssh jax-rs cxf cxf-client


【解决方案1】:

CXF 使用 HttpUrlConnection,所以你需要以编程方式设置一个系统属性

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

或在启动时:

-Dsun.net.http.allowRestrictedHeaders=true

另见How to overwrite http-header "Host" in a HttpURLConnection?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多