我在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]
关于如何获得真实请求的任何想法?
答案 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