¿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"?

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.


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();
}

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í


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

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")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.