Comment obtenir l'URL du domaine et le nom de l'application?


98

Voici le scénario.

Mon application Web Java a le chemin suivant

https://www.mywebsite.com:9443/MyWebApp

Disons qu'il existe un fichier JSP

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

et j'ai besoin de récupérer

https://www.mywebsite.com:9443/MyWebApp 

dans ce fichier JSP.

Bien sûr, il existe une manière plutôt paresseuse et idiote d'obtenir simplement l'URL, puis de retracer le chemin.

Mais y a-t-il une manière programmatique de faire cela? Plus précisément, je pense que je peux obtenir le domaine + le port, mais comment puis-je récupérer le nom de l'application "MyWebApp"?

Réponses:


91

Le nom de l'application Web (en fait le chemin du contexte) est disponible en appelant HttpServletrequest#getContextPath()(et donc PAS getServletPath()comme suggéré précédemment). Vous pouvez le récupérer dans JSP par ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

Si vous avez l'intention de l'utiliser pour tous les chemins relatifs de votre page JSP (ce qui donnerait plus de sens à cette question), vous pouvez utiliser la <base>balise HTML :

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

Tous les liens de la page seront alors automatiquement relatifs au <base>afin que vous n'ayez pas besoin de copier le chemin de contexte partout. Notez que lorsque les liens relatifs commencent par a /, ils ne seront plus relatifs à la <base>, mais à la racine du domaine.


Doc déclare: "Le chemin de contexte renvoyé par ServletContext.getContextPath() doit être considéré comme le chemin de contexte principal ou préféré de l'application". C'est la raison pour laquelle j'ai inclus celui-ci dans ma réponse originale, après avoir réalisé la chose. Je n'ai pas supprimé ma première tentative, car je souhaite que l'OP envisage de lire la documentation et d'en savoir un peu plus sur les méthodes associées. J'espère que vous comprenez mon point.
Adeel Ansari

@Vinegar: Pour les fichiers JSP, les getServletPath()retours /filename.jsp. Le PO ne demandait pas du tout cela, ce n'est certainement pas la voie à suivre.
BalusC

Je ferais certainement une correction dans mon post, mais cette fois, j'attendais la réponse à mon commentaire, qui est entièrement différente :)
Adeel Ansari

2
Dans XHTML DOCTYPE, vous devrez ajouter un caractère «/» au contextPath. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa

Pourquoi n'avez-vous pas fermé le <base>tag? Toutes les balises ne devraient-elles pas être fermées?
Fabiano Francesconi

107

Jetez un œil à la documentation de HttpServletRequest.
Pour créer l'URL de votre exemple, vous devrez utiliser:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

Voici une méthode qui retournera votre exemple:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

1
comment obtenir l'IP au cas où le nom du serveur serait localhost?
Mahmoud Saleh

juste note rapide, getScheme () ne fonctionne pas toujours pour https, certains serveurs ont un comportement étrange et peuvent toujours renvoyer http au lieu de https. J'ai pensé que je devrais te le faire savoir. essayez request.getRequestURL (). toString () et massez si vous en avez besoin
K ''

1
@MahmoudSalehrequest.getLocalAddr()
bleu

Ce sera bien si vous montrez également l'exemple de sortie pour chacune des méthodes. Il est difficile de mettre en place un serveur Web juste pour vérifier quelle pourrait être la sortie de chacun.
Jus12

1
getContextPath()dans la méthode ne renvoie rien! Et getServerPort()ne renvoie qu'un nombre à 2 chiffres, pas un nombre à 4 chiffres! Pourrais-je avoir de l'aide à ce sujet?
sam

22

Le nom de l'application provient de getContextPath.

Je trouve ce graphique de l' Agile Software Craftsmanship HttpServletRequest Path Decoding trie toutes les différentes méthodes disponibles:

entrez la description de l'image ici


1
Ce graphique est utile pour répondre à de nombreuses questions. J'ai essayé de l'utiliser dans la réponse à de nombreuses questions, mais elles ont toutes été supprimées: il existe une règle interdisant de réutiliser la même réponse. Ce qui est dommage. La théorie est que si vous utilisez la même réponse, les questions doivent être les mêmes, et par conséquent, vous devez simplement marquer la question comme un double. Mais ce n’est pas la réalité. Il existe de nombreuses questions différentes auxquelles il est possible de répondre avec le même graphique. Il est restreint de mettre en œuvre de telles règles arbitraires. Si VOUS voyez une question à laquelle il est préférable de répondre avec ce graphique, veuillez l'utiliser.
AgilePro


4

Le code suivant peut être utile pour les applications Web utilisant JavaScript.

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

0

Si une URL vous est transmise sous forme de chaîne et que vous souhaitez extraire la racine de contexte de cette application, vous pouvez utiliser cette expression régulière pour l'extraire. Cela fonctionnera pour les URL complètes ou relatives qui commencent par la racine du contexte.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.