JAX RS注入了URIInfo,在反向代理中为REST请求返回localhost

时间:2017-09-14 19:59:47

标签: jax-rs haproxy

我在HAProxy反向代理中有一组IBM Websphere Liberty概要文件服务器。一切正常,但HAProxy正在对请求做一些事情,所以我无法使用uriInfo.getBaseUri()或uriInfo.getRequestUriBuilder()。build(“无论路径”)在请求中获取正确的URL ...它们都返回localhost: 9080作为主机和端口,因此我无法构建指向该服务的正确URL。 (请求是标准http://api.MYHOST.com/v1/ ... REST请求)

当然,我在方法中使用@Context获取uriInfo对象,以便获取请求信息。

前端配置:

  reqadd X-Forwarded-Proto:\ http
  # Add CORS headers when Origin header is present
  capture request header origin len 128
  http-response add-header Access-Control-Allow-Origin %[capture.req.hdr(0)] if { capture.req.hdr(0) -m found }
  rspadd Access-Control-Allow-Methods:\ GET,\ HEAD,\ OPTIONS,\ POST,\ PUT  if { capture.req.hdr(0) -m found }
  rspadd Access-Control-Allow-Credentials:\ true  if { capture.req.hdr(0) -m found }
  rspadd Access-Control-Allow-Headers:\ Origin,\ X-Requested-With,\ Content-Type,\ Accept  if { capture.req.hdr(0) -m found }

后端配置是:

  option forwardfor
  http-request set-header Host api.MYHOST.com
  http-request set-header X-Forwarded-Host %[dst]
  http-request set-header X-Forwarded-Port %[dst_port]

关于如何获得真实请求的任何想法?

2 个答案:

答案 0 :(得分:0)

我设法在请求中使用正确的主机的唯一方法是在方法参数中注入HttpServletRequest对象。 我还注入了UriInfo,它包含除主机名之外的所有有效信息:

@Context UriInfo uriInfo, @Context HttpServletRequest request

之后我使用来自Apache HttpClient utils的URIBuilder(而不是UriBuilder)将主机更改为正确的主机,因为jax-rs UriBuilder是不可变的:

new URIBuilder(uriInfo.getBaseUriBuilder().path("/MyPath").queryParam("MyParameter",myParameterValue)).build()).setHost(request.getServerName()).toString()

我还必须包含setPort()和setScheme()以确保使用正确的端口和方案(正确的端口和方案在HttpServletRequest中,而不是UriInfo)

答案 1 :(得分:0)

我刚刚在基于 Jersey 的应用程序中遇到了这个问题,我使用 uriInfo.getBaseUriBuilder() 获取 UrlBuilder 并发现可以使用 localhost 更改主机名{1}} 方法

.host()

并且您可以通过将其设置为 -1 来删除端口部分

.host(InetAddress.getLocalHost().getHostName())

所以从一个看起来像的网址

.port(-1)

我得到了

https://127.0.0.1:8443/hello