Obtenir l’URL complète et la chaîne de requête dans Servlet pour les requêtes HTTP et HTTPS

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.

Utilisez l’extrait ci-dessous:

 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.

Demandes liées

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.

Simplement utiliser:

 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,

  1. si votre proxy a été configuré pour transférer les en-têtes correctement ( Host , X-forwarded-proto , X-forwarded-for , etc.).
  2. si votre conteneur de services (par exemple, 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
  3. si votre code ou conteneur de service traite correctement les en-têtes. Par exemple, 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.