¿Cómo obtener la URL del dominio y el nombre de la aplicación?

98

Este es el escenario.

Mi aplicación web Java tiene la siguiente ruta

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

Digamos que hay un archivo JSP

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

y necesito recuperar

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

dentro de este archivo JSP.

Por supuesto, hay una forma bastante perezosa y tonta de simplemente obtener la URL y luego volver a rastrear la ruta.

¿Pero hay una forma programática de hacer esto? Específicamente, creo que puedo obtener el dominio + puerto, pero ¿cómo puedo recuperar el nombre de la aplicación "MyWebApp"?

Ericbae
fuente

Respuestas:

91

El nombre de la aplicación web (en realidad, la ruta de contexto) está disponible llamando HttpServletrequest#getContextPath()(y, por lo tanto, NO getServletPath()como se sugirió anteriormente). Puede recuperar esto en JSP mediante ${pageContext.request.contextPath}.

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

Si tiene la intención de usar esto para todas las rutas relativas en su página JSP (lo que haría que esta pregunta tuviera más sentido), puede hacer uso de la <base>etiqueta 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>

Todos los enlaces de la página serán automáticamente relativos a los de <base>modo que no necesite copiar y pegar la ruta de contexto en todas partes. Tenga en cuenta que cuando los enlaces relativos comienzan con a /, ya no serán relativos a los <base>, sino a la raíz del dominio.

BalusC
fuente
Doc dice: "La ruta de contexto devuelta por ServletContext.getContextPath() debe considerarse como la ruta de contexto principal o preferida de la aplicación". Esa fue la razón por la que incluí este en mi respuesta original, después de darme cuenta de la cosa. No eliminé mi primer intento, ya que quiero que el OP considere leer los documentos y sepa un poco más sobre los métodos relacionados. Espero que entiendas mi punto.
Adeel Ansari
@Vinegar: para archivos JSP, las getServletPath()devoluciones /filename.jsp. El OP no estaba pidiendo eso en absoluto, ciertamente este no es el camino a seguir.
BalusC
Ciertamente haría una corrección en mi publicación, pero esta vez esperaba la respuesta a mi comentario, que es completamente diferente :).
Adeel Ansari
2
En XHTML DOCTYPE, deberá agregar un carácter '/' al contextPath. <base href = "$ {pageContext.request.contextPath} /">
Basil Musa
¿Por qué no cerraste la <base>etiqueta? ¿No deberían cerrarse todas las etiquetas?
Fabiano Francesconi
106

Eche un vistazo a la documentación de HttpServletRequest.
Para construir la URL en su ejemplo, necesitará usar:

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

Aquí hay un método que devolverá su ejemplo:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Jataro
fuente
1
¿Cómo obtener la ip en caso de que el nombre del servidor sea localhost?
Mahmoud Saleh
solo nota rápida, getScheme () no siempre funciona para https, algunos servidores tienen un comportamiento extraño y siempre pueden devolver http en lugar de https. Pensé que debería hacértelo saber. intente request.getRequestURL (). toString () y masajee si lo necesita
K ''
1
@MahmoudSalehrequest.getLocalAddr()
azulado
Será bueno si también muestra el resultado de ejemplo para cada uno de los métodos. Es una molestia poner en marcha un servidor web solo para comprobar cuál podría ser la salida de cada uno.
Jus12
1
getContextPath()en el método no devuelve nada! ¡Y getServerPort()devuelve solo un número de 2 dígitos, no un número de 4 dígitos! ¿Podría ayudarme?
sam
22

El nombre de la aplicación proviene getContextPath.

Encuentro que este gráfico de Agile Software Craftsmanship HttpServletRequest Path Decoding clasifica todos los diferentes métodos que están disponibles:

ingrese la descripción de la imagen aquí

AgilePro
fuente
1
Este gráfico es útil para responder a muchas preguntas. Intenté usarlo en la respuesta a muchas preguntas, pero todas fueron eliminadas: hay una regla que prohíbe reutilizar la misma respuesta. Que es una pena. La teoría es que si usa la misma respuesta, las preguntas deben ser las mismas y, por lo tanto, debe marcar la pregunta como duplicada. Pero esa no es la realidad. Hay muchas preguntas diferentes que se pueden responder con el mismo gráfico. Es mezquino implementar reglas tan arbitrarias. Si USTED ve una pregunta que se responde mejor con este gráfico, utilícela.
AgilePro
4

El siguiente código puede resultar útil para aplicaciones web que utilizan JavaScript.

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

newURL = newURL.substring(0,newURL.indexOf(""));
Minúsculo
fuente
0

Si se le pasa una URL como una cadena y desea extraer la raíz de contexto de esa aplicación, puede usar esta expresión regular para extraerla. Funcionará para URL completas o URL relativas que comiencen con la raíz de contexto.

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