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"?

Ericbae
la source

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.

BalusC
la source
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();
}
Jataro
la source
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

AgilePro
la source
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
7

Je vous suggère fortement de lire les documents , pour des méthodes similaires. Si vous êtes intéressé par le chemin de contexte, regardez ici, ServletContext.getContextPath () .

Adeel Ansari
la source
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(""));
Minuscule
la source
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")
master_d
la source