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

kum*_*mar 29 java servlets http httprequest http-headers

我在jboss容器中部署了两个应用程序(相同的unix框).如果我从app1收到请求,我需要为app2设置相应的请求.

例如:
如果app1请求是:http://example.com/context? param1 = 123
然后我需要提取" http://example.com/ ",以便我可以构建第二个应用程序的请求.

我试过用:

  HttpServletRequest.getServerName() & 
  HttpServletRequest.getServerPort() & \
  HttpServletRequest.getHeader("host") 
Run Code Online (Sandbox Code Playgroud)

方法,但请求可能是http或https.

如果还有其他更好的方法,请告诉我.谢谢!

Dav*_*que 47

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

使用它HttpServletRequest.getServerName()应该足以重建您需要的URL部分.

如果您使用的是标准端口(80为http,443为https),则无需在URL中明确放置端口.

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

1)HttpServletRequest.getHeader("x-forwarded-proto")改为使用; 这只适用于您的负载均衡器正确设置标头(Apache应该是afaik).

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

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


jta*_*orn 19

您可以使用HttpServletRequest.getRequestURLHttpServletRequest.getRequestURI.

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String host = url.substring(0, url.indexOf(uri)); //result
Run Code Online (Sandbox Code Playgroud)

  • 这将给出整个网址,这不是我期待的,我不想操纵网址字符串并获得所需的部分. (2认同)

Mam*_*dar 7

如果您的服务器在代理服务器后面运行,请确保设置了代理标头:

proxy_set_header X-Forwarded-Proto  $scheme;
Run Code Online (Sandbox Code Playgroud)

然后为了获得正确的结果,scheme & url你可以使用 springframework 的类:

public String getUrl(HttpServletRequest request) {
    HttpRequest httpRequest = new ServletServerHttpRequest(request);
    UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build();

    String scheme = uriComponents.getScheme();             // http / https
    String serverName = request.getServerName();     // hostname.com
    int serverPort = request.getServerPort();        // 80
    String contextPath = request.getContextPath();   // /app

    // Reconstruct original requesting URL
    StringBuilder url = new StringBuilder();
    url.append(scheme).append("://");
    url.append(serverName);

    if (serverPort != 80 && serverPort != 443) {
        url.append(":").append(serverPort);
    }
    url.append(contextPath);
    return url.toString();
}
Run Code Online (Sandbox Code Playgroud)


mic*_*czy 6

似乎您需要从 URL 中删除 URL,因此您可以通过以下方式执行此操作:

request.getRequestURL().toString().replace(request.getRequestURI(), "")
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用负载均衡器和 Nginx,则无需修改代码即可配置它们。

nginx:

proxy_set_header       Host $host;  
proxy_set_header  X-Real-IP  $remote_addr;  
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
proxy_set_header X-Forwarded-Proto  $scheme;  
Run Code Online (Sandbox Code Playgroud)

Tomcat的server.xml引擎:

<Valve className="org.apache.catalina.valves.RemoteIpValve"  
remoteIpHeader="X-Forwarded-For"  
protocolHeader="X-Forwarded-Proto"  
protocolHeaderHttpsValue="https"/> 
Run Code Online (Sandbox Code Playgroud)

如果只修改Nginx配置文件,java代码应该是:

String XForwardedProto = request.getHeader("X-Forwarded-Proto");
Run Code Online (Sandbox Code Playgroud)