За задумом 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, який демонструє точну проблему?