Java: строковое представление только хоста, схемы, возможно порта из запроса сервлета - PullRequest
9 голосов
/ 09 июля 2009

Я работаю с разными серверами и конфигурациями. Каков наилучший подход к Java-коду для получения схемы: // host: [port, если это не порт 80].

Вот код, который я использовал, но не знаю, лучший ли это подход. (это псевдокод)

HttpServletRequest == запрос

String serverName = request.getServerName().toLowerCase();
String scheme = request.getScheme();
int port = request.getServerPort();

String val = scheme + "://" + serverName + ":" port;

Так что val возвращает:

http(s)://server.com/

или

http(s)://server.com:7770

По сути, мне нужно все, кроме строки запроса и контекста.

Я также подумал об использовании URL:

String absURL = request.getRequestURL();
URL url = new URL(absURL);

url.get????

Ответы [ 5 ]

18 голосов
/ 09 июля 2009

попробуйте это:

URL serverURL = new URL(request.getScheme(),      // http
                        request.getServerName(),  // host
                        request.getServerPort(),  // port
                        "");                      // file

EDIT

скрытие порта по умолчанию на http и https :

int port = request.getServerPort();

if (request.getScheme().equals("http") && port == 80) {
    port = -1;
} else if (request.getScheme().equals("https") && port == 443) {
    port = -1;
}

URL serverURL = new URL(request.getScheme(), request.getServerName(), port, "");
2 голосов
/ 09 июля 2009
URI u=new URI("http://www.google.com/");
String s=u.getScheme()+"://"+u.getHost()+":"+u.getPort();

Как сказал Cookie, с java.net.URI ( документы ).

1 голос
/ 09 июля 2009
public String getServer(HttpServletRequest request) {
  int port = request.getServerPort();
  StringBuilder result = new StringBuilder();
  result.append(request.getScheme())
        .append("://")
        .append(request.getServerName());

  if (port != 80) {
    result.append(':')
          .append(port);
  }

  return result;
}
0 голосов
/ 09 июля 2009

Если вы хотите сохранить URL-адрес в том виде, в котором он появился в запросе (например, отключить порт, если он явно не указан), вы можете использовать что-то подобное Регулярное выражение совпадает с URL-адресами HTTP и HTTPS. Группа захвата 1 содержит корневой каталог сервера со схемы на дополнительный порт. (Это то, что вам нужно.) Группа 2 содержит только имя хоста.

String regex = "(^http[s]?://([\\w\\-_]+(?:\\.[\\w\\-_]+)*)(?:\\:[\\d]+)?).*$";
Matcher urlMatcher = Pattern.compile(regex).matcher(request.getRequestURL());
String serverRoot = urlMatcher.group(1);
0 голосов
/ 09 июля 2009

Я думаю java.net.URI делает то, что вы хотите.

...