Ответ 1
По дизайну getRequestURL()
вы получаете полный URL-адрес, не содержащий только строку запроса.
В HttpServletRequest
вы можете получить отдельные части URI, используя следующие методы:
// Example: http://myhost:8080/people?lastname=Fox&age=30
String uri = request.getScheme() + "://" + // "http" + "://
request.getServerName() + // "myhost"
":" + // ":"
request.getServerPort() + // "8080"
request.getRequestURI() + // "/people"
"?" + // "?"
request.getQueryString(); // "lastname=Fox&age=30"
-
.getScheme()
даст вам"https"
, если это был запросhttps://domain
. -
.getServerName()
даетdomain
наhttp(s)://domain
. -
.getServerPort()
предоставит вам порт.
Используйте фрагмент ниже:
String uri = request.getScheme() + "://" +
request.getServerName() +
("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +
request.getRequestURI() +
(request.getQueryString() != null ? "?" + request.getQueryString() : "");
Этот фрагмент выше получит полный URI, скрывая порт, если использовался по умолчанию, и не добавлял "?"
и строку запроса, если последняя не была предоставлена.
Проксированные запросы
Обратите внимание, что если ваш запрос проходит через прокси-сервер, вам нужно посмотреть заголовок X-Forwarded-Proto
, так как схема может быть изменена:
request.getHeader("X-Forwarded-Proto")
Кроме того, общий заголовок X-Forwarded-For
, который показывает исходный IP-адрес запроса вместо proxys-IP.
request.getHeader("X-Forwarded-For")
Если вы сами отвечаете за конфигурацию прокси-сервера/балансировки нагрузки, вам необходимо убедиться, что эти заголовки настроены при пересылке.