如何从 http 或 https 请求获取带有端口的主机名

2022-09-01 01:47:53

我在JBoss容器(相同的unix盒子)中部署了两个应用程序。如果我收到来自 app1 的请求,我需要发送相应的 app2 请求。

例如:如果 app1 请求:,那么我需要提取 ,以便我可以发送第二个应用的请求。http://example.com/context?param1=123http://example.com/

我尝试使用

  HttpServletRequest.getServerName() & 
  HttpServletRequest.getServerPort() & \
  HttpServletRequest.getHeader("host")

但是我怎么能在 或 之间定位 ?httphttps


答案 1

您可以使用 来检索“http”或“https”。HttpServletRequest.getScheme()

同时使用它应该足以重建所需的URL部分。HttpServletRequest.getServerName()

如果您使用的是标准端口(http 为 80,https 为 443),则无需将端口显式放在 URL 中。

编辑:如果你的 servlet 容器位于终止 SSL 的反向代理或负载均衡器后面,那会有点棘手,因为请求会作为普通 http 转发到 servlet 容器。您有几种选择:

  1. 使用代替;这仅在负载均衡器正确设置标头时才有效(Apache应该afaik)。HttpServletRequest.getHeader("x-forwarded-proto")

  2. 在 JBoss/Tomcat 中配置一个 RemoteIpValve,使其按预期工作。同样,这只有在负载均衡器设置了正确的标头时才有效。getScheme()

  3. 如果上述方法不起作用,您可以在 Tomcat/JBoss 中配置两个不同的连接器,一个用于 http,另一个用于 https,如本文所述。


答案 2

您可以使用 HttpServletRequest.getRequestURLHttpServletRequest.getRequestURI

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
int idx = (((uri != null) && (uri.length() > 0)) ? url.indexOf(uri) : url.length());
String host = url.substring(0, idx); //base url
idx = host.indexOf("://");
if(idx > 0) {
  host = host.substring(idx); //remove scheme if present
}

推荐