gpt4 book ai didi

jax-rs - JAX RS 注入(inject) URIInfo 为反向代理中的 REST 请求返回本地主机

转载 作者:行者123 更新时间:2023-12-04 16:09:03 25 4
gpt4 key购买 nike

我在 HAProxy 反向代理中有一组 IBM Websphere Liberty 配置文件服务器。一切正常,但 HAProxy 正在对请求执行某些操作,因此我无法使用 uriInfo.getBaseUri()uriInfo.getRequestUriBuilder().build("whatever path"在请求中获取正确的 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]

关于如何获得真正的请求有什么想法吗?

最佳答案

我设法在请求中使用正确主机的唯一方法是在方法参数中注入(inject) HttpServletRequest 对象。我还注入(inject)了 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 中)

关于jax-rs - JAX RS 注入(inject) URIInfo 为反向代理中的 REST 请求返回本地主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com