Tomcat的:getHeader(“主机”)与getServerName()(Tomcat: ge

2019-06-24 03:09发布

我有一个正在从多个域提供了一个Tomcat应用程序。 上一页开发商建退回的应用程序URL(见下文)的方法。 在该方法中,他们请求的服务器名( request.getServerName()其适当地,返回从httpd.conf文件中的ServerName。

不过,我不希望出现这种情况。 我想的是,浏览器发送的请求,即取其域的浏览器正在访问从应用程序的主机名。

我试图getHeader("Host")但仍返回服务器名httpd.conf文件中设置。

取而代之的request.getServerName()我应该怎么用获取服务器名称,浏览器发送的请求?

例如:

  • 服务器名在httpd.conf:www.myserver.net
  • 用户访问的www.yourserver.net Tomcat的应用

我需要返回www.yourserver.net www.myserver.net。request.getServerName()调用似乎只返回www.myserver.net

/**
 * Convenience method to get the application's URL based on request
 * variables.
 * 
 * @param request the current request
 * @return URL to application
 */
public static String getAppURL(HttpServletRequest request) {
    StringBuffer url = new StringBuffer();
    int port = request.getServerPort();
    if (port < 0) {
        port = 80; // Work around java.net.URL bug
    }
    String scheme = request.getScheme();
    url.append(scheme);
    url.append("://");
    url.append(request.getServerName());
    if (("http".equals(scheme) && (port != 80)) || ("https".equals(scheme) && (port != 443))) {
        url.append(':');
        url.append(port);
    }
    url.append(request.getContextPath());
    return url.toString();
}

提前致谢!

Answer 1:

你需要确保httpd经过Host由客户到Tomcat提供的头。 最简单的方法(假设你使用mod_proxy_http -你没有说)是以下几点:

ProxyPreserveHost On


Answer 2:

如何使用的东西,像我一样在这个演示JSP?

<%
  String requestURL = request.getRequestURL().toString();
  String servletPath = request.getServletPath();
  String appURL = requestURL.substring(0, requestURL.indexOf(servletPath));
%>
appURL is <%=appURL%>


Answer 3:

也许没有涉及到这个问题。 如果使用的是Tomcat,则可以在请求报头指定任何主机串,即使像的javascript <script>alert(document.cookie);</script>

然后,它可以显示在页面上:

<p> host name is : <%= request.getServerName() %> </p>

因此,你需要在使用前进行验证



Answer 4:

这的确是非常有问题的,因为有时你甚至不知道在哪里,你希望成为一个完全合格的域名主机已被删除。 @rickz提供了一个很好的解决方案,但这里有另外一个,我认为是更完整,涵盖了许多不同的网址:

基本上,你剥去协议(http://,https://开头,FTP://,...),那么端口(它应该存在),然后整个URI。 这就给了你顶级域和子域的完整列表。

String requestURL = request.getRequestURL().toString();
String withoutProtocol = requestURL.replaceAll("(.*\\/{2})", "")
String withoutPort = withoutProtocol.replaceAll("(:\\d*)", "") 
String domain = withoutPort.replaceAll("(\\/.*)", "")

我使用内联方法定义这样做的斯卡拉,但上面的代码是更详细的,因为我发现它更好地张贴在纯Java的解决方案。 所以,如果你为这个创建方法,你可以把它们连到做这样的事情:

removeURI(removePort(removeProtocol(requestURL)))


文章来源: Tomcat: getHeader(“Host”) vs. getServerName()