Come ottenere l'URL del dominio e il nome dell'applicazione?
Domanda
Ecco lo scenario.
La mia applicazione web Java ha seguente percorso
https://www.mywebsite.com:9443/MyWebApp
Diciamo che c'è un file JSP
https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp
e ho bisogno di recuperare
https://www.mywebsite.com:9443/MyWebApp
all'interno di questo file JSP.
Naturalmente, v'è piuttosto un modo pigro e stupido di appena ottenere l'URL e poi ri-tracciare il percorso di ritorno.
Ma c'è un modo programmatico di fare questo? In particolare, penso di poter ottenere il dominio + porto, ma come faccio davvero recuperare il nome dell'applicazione "MyWebApp"?
Soluzione
Il nome dell'applicazione web (in realtà il percorso del contesto) è disponibile chiamando HttpServletrequest#getContextPath()
(e quindi non getServletPath()
come uno suggerito prima). È possibile recuperare questo in JSP per ${pageContext.request.contextPath}
.
<p>The context path is: ${pageContext.request.contextPath}.</p>
Se avete intenzione di usare questo per tutti i percorsi relativi a pagina JSP (che renderebbe questa domanda più senso), allora si può fare uso del tag 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>
Tutti i link nella pagina saranno quindi automagicamente essere relativo alla <base>
in modo che non c'è bisogno di CopyPaste il percorso del contesto in tutto il mondo. Si noti che quando i link relativi iniziano con un /
, allora saranno non essere relativo al <base>
più, ma alla radice di dominio invece.
Altri suggerimenti
Date un'occhiata alla documentazione per HttpServletRequest
.
Al fine di costruire l'URL nel tuo esempio è necessario utilizzare:
-
getScheme()
-
getServerName()
-
getServerPort()
-
getContextPath()
Qui è un metodo che restituirà il vostro esempio:
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Il nome dell'applicazione viene da getContextPath
.
Lo trovo grafica da Agile Software Artigianato HttpServletRequest percorso di decodifica ordina fuori tutti i diversi metodi che sono disponibili:
caldamente suggerire di leggere attraverso la docs , per metodi simili. Se siete interessati a percorso contesto, date un'occhiata qui, ServletContext.getContextPath () .
Il codice seguente potrebbe essere utile per l'applicazione web utilizzando JavaScript.
var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
Se è in passato un URL come stringa e desidera estrarre la radice contesto di tale domanda, è possibile utilizzare questo regex per estrarlo. Essa opererà per gli URL completo o relativo URL che iniziano con la root di contesto.
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")