За задумом getRequestURL()дає повну URL-адресу, в якій відсутній лише рядок запиту.
В HttpServletRequest, ви можете отримати окремі частини URI , використовуючи методи нижче:
String uri = request.getScheme() + "://" +
request.getServerName() +
":" +
request.getServerPort() +
request.getRequestURI() +
"?" +
request.getQueryString();
.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-запиту замість IP-адреси proxys.
request.getHeader("X-Forwarded-For")
Якщо ви самі відповідаєте за конфігурацію проксі / балансира навантаження, вам потрібно переконатися, що ці заголовки встановлюються під час пересилання.
HttpServletRequest, будують їх неправильно. Можливо, ви можете створити SSCCE, який демонструє точну проблему?