J’écris un code dont la tâche est de récupérer une URL ou un chemin complet. J’ai écrit ce code:
HttpServletRequest request;//obtained from other functions Ssortingng uri = request.getRequestURI(); if (request.getQuerySsortingng() != null) uri += "?" + request.getQuerySsortingng();
Ainsi, lorsque je navigue sur http://google.com?q=abc
c’est OK (correct). Mais il y a un problème lorsque je navigue sur https://google.com
. La valeur de uri
est http://google.com:443google.com:443
. Le programme ne fonctionne donc pas uniquement lorsque HTTPS
est utilisé.
Et la sortie est la même pour request.getRequestURL().toSsortingng()
.
Quelle est la solution?
De par sa conception, getRequestURL()
vous donne l’URL complète, il ne manque que la chaîne de requête.
Dans HttpServletRequest
, vous pouvez obtenir des parties individuelles de l’URI en utilisant les méthodes ci-dessous:
// Example: http://myhost:8080/people?lastname=Fox&age=30 Ssortingng uri = request.getScheme() + "://" + // "http" + ":// request.getServerName() + // "myhost" ":" + // ":" request.getServerPort() + // "8080" request.getRequestURI() + // "/people" "?" + // "?" request.getQuerySsortingng(); // "lastname=Fox&age=30"
.getScheme()
vous donnera "https"
s’il s’agissait d’une demande de https://domain
. .getServerName()
donne le domain
sur http(s)://domain
. .getServerPort()
vous donnera le port. Ssortingng uri = request.getScheme() + "://" + request.getServerName() + ("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) + request.getRequestURI() + (request.getQuerySsortingng() != null ? "?" + request.getQuerySsortingng() : "");
Cet extrait ci-dessus va obtenir l’URI complet, en masquant le port si celui par défaut a été utilisé, sans append le "?"
et la chaîne de requête si cette dernière n’a pas été fournie.
Notez que si votre requête passe par un proxy, vous devez examiner l’en X-Forwarded-Proto
tête X-Forwarded-Proto
car le schéma peut être modifié:
request.getHeader("X-Forwarded-Proto")
En outre, un en-tête commun est X-Forwarded-For
, qui affiche l’adresse IP de la requête d’origine au lieu de l’adresse IP du proxy.
request.getHeader("X-Forwarded-For")
Si vous êtes responsable de la configuration du proxy / équilibreur de charge vous-même, vous devez vous assurer que ces en-têtes sont définis lors du transfert.
Ssortingng Uri = request.getRequestURL()+"?"+request.getQuerySsortingng();
Le fait qu’une requête HTTPS
devienne HTTP
lorsque vous avez essayé de créer l’URL côté serveur indique que vous pouvez avoir un équilibreur de charge / proxy ( nginx
, pound
, etc.) déchargeant le chiffrement SSL en avant et en arrière sur votre service principal en clair HTTP
.
Si c’est le cas, vérifiez,
Host
, X-forwarded-proto
, X-forwarded-for
, etc.). Tomcat
) est configuré pour reconnaître le proxy devant. Par exemple, Tomcat
nécessite l’ajout d’atsortingbuts secure="true" scheme="https" proxyPort="443"
à son Connector
Tomcat
remplace automatiquement les valeurs de scheme
, remoteAddr
, etc. lorsque vous ajoutez RemoteIpValve
à son Engine
. (voir Guide de configuration , JavaDoc ) afin de ne pas avoir à traiter ces en-têtes manuellement dans votre code. Des valeurs d’en-tête proxy incorrectes peuvent entraîner une sortie incorrecte lorsque request.getRequestURI()
ou request.getRequestURL()
tente de créer l’URL d’origine.