web-dev-qa-db-fra.com

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

Voici le scénario.

Mon application Web Java a le chemin suivant

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

Disons qu'il y a 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 un moyen plutôt paresseux et idiot d’obtenir 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 pouvoir obtenir le domaine + le port, mais comment puis-je récupérer le nom de l'application "MyWebApp"?

90
ericbae

Le nom de l'application Web (en réalité le chemin du contexte) est disponible en appelant HttpServletrequest#getContextPath() (et donc NOT getServletPath() comme suggéré auparavant). Vous pouvez récupérer cela 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 balise HTML <base>:

<%@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 associés au <base>, de sorte que vous n’auriez pas besoin de copier le chemin du contexte partout. Notez que lorsque les liens relatifs commencent par un /, ils ne seront plus relatifs au <base>, mais à la racine du domaine.

88
BalusC

Consultez la documentation de HttpServletRequest .
Pour construire l'URL dans 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();
}
103
Jataro

Le nom de l'application provient de getContextPath.

Je trouve ce graphique de Agile Software Craftsmanship HttpServletRequest Path Decoding trie toutes les méthodes disponibles

 enter image description here

8
AgilePro

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

7
Adeel Ansari

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(""));
3
user2496033

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

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
0
master_d