Mit dem Design, getRequestURL()
gibt Ihnen die vollständige URL, nur die Abfragezeichenfolge fehlt.
In HttpServletRequest
können Sie einzelne Teile des URI mit den folgenden Methoden abrufen:
String uri = request.getScheme() + "://" +
request.getServerName() +
":" +
request.getServerPort() +
request.getRequestURI() +
"?" +
request.getQueryString();
.getScheme()
wird Ihnen geben, "https"
wenn es eine https://domain
Anfrage war.
.getServerName()
gibt domain
auf http(s)://domain
.
.getServerPort()
wird Ihnen den Hafen geben.
Verwenden Sie das folgende Snippet:
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() : "");
In diesem obigen Snippet wird der vollständige URI abgerufen, wobei der Port ausgeblendet wird, wenn der Standard-URI verwendet wurde, und der "?"
und die Abfragezeichenfolge nicht hinzugefügt werden, wenn letzterer nicht angegeben wurde.
Proxied Anfragen
Beachten Sie, dass Sie sich den X-Forwarded-Proto
Header ansehen müssen, wenn Ihre Anforderung einen Proxy durchläuft, da das Schema möglicherweise geändert wird:
request.getHeader("X-Forwarded-Proto")
Es gibt auch einen allgemeinen Header X-Forwarded-For
, der die ursprüngliche Anforderungs-IP anstelle der Proxy-IP anzeigt.
request.getHeader("X-Forwarded-For")
Wenn Sie selbst für die Konfiguration des Proxy- / Load-Balancers verantwortlich sind, müssen Sie sicherstellen, dass diese Header bei der Weiterleitung festgelegt werden.
HttpServletRequest
diese falsch konstruieren. Vielleicht können Sie eine SSCCE erstellen , die das genaue Problem demonstriert?