Come ottenere l'URL del dominio e il nome dell'applicazione?


98

Ecco lo scenario.

La mia applicazione web Java ha il seguente percorso

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

Supponiamo che ci sia 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, c'è un modo piuttosto pigro e sciocco per ottenere l'URL e poi risalire al percorso.

Ma esiste un modo programmatico per farlo? Nello specifico, penso di poter ottenere il dominio + la porta, ma come faccio a recuperare effettivamente il nome dell'applicazione "MyWebApp"?

Risposte:


91

Il nome dell'applicazione web (in realtà il percorso del contesto) è disponibile chiamando HttpServletrequest#getContextPath()(e quindi NON getServletPath()come suggerito prima). Puoi recuperarlo in JSP da ${pageContext.request.contextPath}.

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

Se intendi utilizzarlo per tutti i percorsi relativi nella tua pagina JSP (il che renderebbe più sensata questa domanda), puoi utilizzare il <base>tag 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>

Tutti i collegamenti nella pagina saranno quindi automaticamente relativi a in <base>modo che non sia necessario copiare e incollare il percorso del contesto ovunque. Si noti che quando i collegamenti relativi iniziano con a /, non saranno più relativi a <base>, ma alla radice del dominio.


Doc afferma: "Il percorso di contesto restituito da ServletContext.getContextPath() deve essere considerato come il percorso di contesto principale o preferito dell'applicazione". Questo è stato il motivo per cui ho incluso questo nella mia risposta originale, dopo aver realizzato la cosa. Non ho rimosso il mio primo tentativo, poiché desidero che l'OP consideri la lettura dei documenti e sappia un po 'di più sui metodi correlati. Spero tu abbia capito il mio punto.
Adeel Ansari

@Vinegar: per i file JSP, i getServletPath()ritorni /filename.jsp. L'OP non lo chiedeva affatto, questa non è certamente la strada da percorrere.
BalusC

Certamente farei una correzione nel mio post, ma questa volta mi aspettavo la risposta al mio commento, che è completamente diversa :).
Adeel Ansari

2
In XHTML DOCTYPE, sarà necessario aggiungere un carattere "/" a contextPath. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa

Perché non hai chiuso il <base>tag? Non dovrebbero essere chiusi tutti i tag?
Fabiano Francesconi

107

Dai un'occhiata alla documentazione per HttpServletRequest.
Per creare l'URL nel tuo esempio dovrai utilizzare:

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

Ecco un metodo che restituirà il tuo esempio:

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

1
come ottenere l'ip nel caso in cui il servername fosse localhost?
Mahmoud Saleh

solo una breve nota, getScheme () non funziona sempre per https, alcuni server hanno un comportamento strano e possono sempre restituire http invece di https. ho pensato che avrei dovuto fartelo sapere. prova request.getRequestURL (). toString () e massaggia se ne hai bisogno
K ''

1
@MahmoudSalehrequest.getLocalAddr()
bluastro

Sarà utile se mostri anche l'output di esempio per ciascuno dei metodi. È una seccatura mettere in funzione un server web solo per controllare quale potrebbe essere l'output di ciascuno.
Jus12

1
getContextPath()nel metodo non restituisce nulla! E getServerPort()restituisce solo un numero di 2 cifre, non un numero di 4 cifre! Potrei avvalermi di aiuto su di esso?
sam

22

Il nome dell'applicazione proviene da getContextPath.

Trovo che questo grafico da Agile Software Craftsmanship HttpServletRequest Path Decoding ordina tutti i diversi metodi disponibili:

inserisci qui la descrizione dell'immagine


1
Questo grafico è utile per rispondere a molte domande. Ho provato a usarlo nella risposta a molte domande, ma sono state tutte cancellate: c'è una regola contro il riutilizzo della stessa risposta. Che è un peccato. La teoria è che se usi la stessa risposta, le domande devono essere le stesse e quindi dovresti semplicemente contrassegnare la domanda come duplicata. Ma questa non è la realtà. Ci sono molte domande diverse a cui è possibile rispondere con la stessa grafica. È meschino implementare tali regole arbitrarie. Se VOI vedete una domanda che trova una risposta migliore con questo grafico, utilizzatela.
AgilePro


4

Il codice seguente potrebbe essere utile per l'applicazione Web che utilizza JavaScript.

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

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

0

Se ti viene passato un URL come stringa e desideri estrarre la root di contesto di tale applicazione, puoi utilizzare questa regex per estrarla. Funzionerà per URL completi o relativi che iniziano con la radice del contesto.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.