13

複数のドメインから提供されている 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.myserver.netではなくwww.yourserver.net を返す必要があります。呼び出しはwww.myserver.netのみを返すようです request.getServerName()

/**
 * 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();
}

前もって感謝します!

4

4 に答える 4

17

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

ProxyPreserveHost On
于 2012-05-02T08:59:12.560 に答える
5

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

<%
  String requestURL = request.getRequestURL().toString();
  String servletPath = request.getServletPath();
  String appURL = requestURL.substring(0, requestURL.indexOf(servletPath));
%>
appURL is <%=appURL%>
于 2012-05-02T03:24:25.123 に答える
-1

これは、完全に修飾されたドメインであると期待するホストがどこで削除されたかさえわからない場合があるため、非常に問題があります。@rickz は優れたソリューションを提供してくれましたが、より完全で、さまざまな URL をカバーしていると思われる別のソリューションを次に示します。

基本的に、プロトコル (http://、https://、ftp://、...)、ポート (存在する場合)、URI 全体を取り除きます。これにより、トップ レベル ドメインとサブドメインの完全なリストが得られます。

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

インライン メソッド定義を使用してこれを scala で実行しましたが、純粋な Java でソリューションを投稿する方が良いことがわかったため、上記のコードはより冗長です。したがって、このためのメソッドを作成すると、それらをチェーンして次のようなことを行うことができます。

removeURI(removePort(removeProtocol(requestURL)))
于 2012-06-30T19:04:43.623 に答える