Wie erhalte ich die Domain-URL und den Anwendungsnamen?


98

Hier ist das Szenario.

Meine Java-Webanwendung hat folgenden Pfad

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

Angenommen, es gibt eine JSP-Datei

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

und ich muss abrufen

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

innerhalb dieser JSP-Datei.

Natürlich gibt es eine ziemlich faule und alberne Möglichkeit, nur die URL abzurufen und dann den Pfad zurückzuverfolgen.

Aber gibt es dafür einen programmatischen Weg? Insbesondere denke ich, dass ich den Domain + Port erhalten kann, aber wie kann ich den Anwendungsnamen "MyWebApp" tatsächlich abrufen?

Antworten:


91

Der Name der Webanwendung (eigentlich der Kontextpfad) ist durch Aufrufen verfügbar HttpServletrequest#getContextPath()(und daher NICHT getServletPath()wie zuvor vorgeschlagen). Sie können dies in JSP von abrufen ${pageContext.request.contextPath}.

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

Wenn Sie dies für alle relativen Pfade auf Ihrer JSP-Seite verwenden möchten (was diese Frage sinnvoller machen würde), können Sie das HTML- <base>Tag verwenden:

<%@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>

Alle Links auf der Seite sind dann automatisch relativ zu, <base>sodass Sie den Kontextpfad nicht überall kopieren müssen. Beachten Sie, dass relative Links, die mit a beginnen /, nicht mehr relativ zum <base>, sondern zum Domänenstamm sind.


In Doc heißt es: "Der von zurückgegebene Kontextpfad ServletContext.getContextPath() sollte als primärer oder bevorzugter Kontextpfad der Anwendung betrachtet werden." Das war der Grund, warum ich diese in meine ursprüngliche Antwort aufgenommen habe, nachdem ich die Sache erkannt hatte. Ich habe meinen ersten Versuch nicht entfernt, da ich möchte, dass das OP das Lesen der Dokumente in Betracht zieht und etwas mehr über verwandte Methoden weiß. Ich hoffe, Sie verstehen meinen Standpunkt.
Adeel Ansari

@Vinegar: Bei JSP-Dateien wird getServletPath()zurückgegeben /filename.jsp. Das OP hat das überhaupt nicht verlangt, das ist sicherlich nicht der richtige Weg.
BalusC

Ich würde sicherlich Korrekturen in meinem Beitrag vornehmen, aber diesmal hatte ich die Antwort auf meinen Kommentar erwartet, was völlig anders ist :).
Adeel Ansari

2
In XHTML DOCTYPE müssen Sie dem contextPath ein '/' Zeichen hinzufügen. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa

Warum hast du das <base>Tag nicht geschlossen? Sollten nicht alle Tags geschlossen sein?
Fabiano Francesconi

106

Schauen Sie sich die Dokumentation für an HttpServletRequest.
Um die URL in Ihrem Beispiel zu erstellen, müssen Sie Folgendes verwenden:

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

Hier ist eine Methode, die Ihr Beispiel zurückgibt:

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

1
Wie bekomme ich die IP, falls der Servername localhost war?
Mahmoud Saleh

Nur eine kurze Anmerkung: getScheme () funktioniert nicht immer für https, einige Server haben ein seltsames Verhalten und geben möglicherweise immer http anstelle von https zurück. Ich dachte, ich sollte es dich wissen lassen. versuchen Sie request.getRequestURL (). toString () und massieren Sie, wenn Sie brauchen
K ''

1
@ MahmoudSalehrequest.getLocalAddr()
bläulich

Es ist gut, wenn Sie auch die Beispielausgabe für jede der Methoden anzeigen. Es ist mühsam, einen Webserver zum Laufen zu bringen, nur um zu überprüfen, wie die Ausgabe jedes einzelnen Servers aussehen könnte.
Jus12

1
getContextPath()in der Methode gibt nichts zurück! Und getServerPort()gibt nur eine zweistellige Nummer zurück, keine vierstellige Nummer! Könnte ich etwas Hilfe in Anspruch nehmen?
Sam

22

Der Anwendungsname stammt von getContextPath.

Ich finde diese Grafik von Agile Software Craftsmanship HttpServletRequest Path Decoding sortiert alle verfügbaren Methoden aus:

Geben Sie hier die Bildbeschreibung ein


1
Diese Grafik ist nützlich für die Beantwortung vieler Fragen. Ich habe versucht, es in der Antwort auf viele Fragen zu verwenden, aber sie wurden alle gelöscht: Es gibt eine Regel gegen die Wiederverwendung derselben Antwort. Welches ist eine Schande. Die Theorie besagt, dass wenn Sie dieselbe Antwort verwenden, die Fragen dieselben sein müssen und Sie die Frage daher nur als doppelt markieren sollten. Das ist aber nicht die Realität. Es gibt viele verschiedene Fragen, die mit derselben Grafik beantwortet werden können. Es ist kleinmütig, solche willkürlichen Regeln umzusetzen. Wenn SIE eine Frage sehen, die mit dieser Grafik am besten beantwortet werden kann, verwenden Sie sie bitte.
AgilePro


4

Der folgende Code kann für Webanwendungen mit JavaScript hilfreich sein.

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

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

0

Wenn Ihnen eine URL als Zeichenfolge übergeben wird und Sie den Kontextstamm dieser Anwendung extrahieren möchten, können Sie diesen regulären Ausdruck verwenden, um ihn zu extrahieren. Es funktioniert für vollständige oder relative URLs, die mit dem Kontextstamm beginnen.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.