web-dev-qa-db-ja.com

Tomcat:getHeader( "Host")とgetServerName()

複数のドメインから提供されているTomcatアプリがあります。以前の開発者は、アプリケーションのURLを返すメソッドを作成しました(以下を参照)。メソッドでは、サーバー名(request.getServerName())を要求します。サーバー名は、適切に、httpd.confファイルからServerNameを返します。

しかし、私はそれを望んでいません。私が欲しいのは、ブラウザがリクエストを送信したホスト名、つまりブラウザがアプリケーションにアクセスしているドメインです。

getHeader("Host")を試しましたが、それでもhttpd.confファイルに設定されているServerNameが返されます。

request.getServerName()の代わりに、ブラウザがリクエストを送信したサーバー名を取得するには何を使用すればよいですか?

例えば:

  • httpd.confのServerName:www.myserver.net
  • ユーザーがwww.yourserver.netのTomcatアプリにアクセスします

www.yourserver.net[〜#〜] not [〜#〜]www.myserverを返す必要があります。ネット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();
}

前もって感謝します!

11
Mark Hall

httpdがクライアントから提供されたHostヘッダーをTomcatに渡すことを確認する必要があります。最も簡単な方法(mod_proxy_httpを使用していると仮定-あなたが言っていない)は、次の方法です。

ProxyPreserveHost On
16
Mark Thomas

このデモJSPで行ったようなものを使用してみませんか?

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

多分この質問とは関係ありません。 Tomcatを使用している場合は、リクエストヘッダーに任意のホスト文字列を指定できます。<script>alert(document.cookie);</script>のようなJavaScriptも指定できます。

次に、ページに表示できます。

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

したがって、使用する前に検証する必要があります。

1
maoyang