2010-02-05 25 views
84

Aquí está el escenario.¿Cómo obtener la URL del dominio y el nombre de la aplicación?

aplicación web Mi Java ha ruta siguiente

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 manera bastante vaga y tonta de simplemente obtener la URL y luego reencaminar la ruta de regreso.

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

Respuesta

85

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

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

Si se va a utilizar esto para todas las rutas relativas en su página JSP (lo que haría esta pregunta más sentido), entonces se puede hacer uso del HTML <base> etiqueta:

<%@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 en la página serán automágicamente relativos al <base>, por lo que no es necesario copiar la ruta del contexto en todas partes. Tenga en cuenta que cuando los enlaces relativos comienzan con /, ya no serán relativos al <base>, sino a la raíz del dominio.

+0

Doc indica: "La ruta de contexto devuelta por' ServletContext.getContextPath() 'se debe considerar 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. –

+0

@Vinegar: para los archivos JSP, 'getServletPath()' devuelve '/ filename.jsp'. El OP no estaba pidiendo eso en absoluto, ciertamente este no es el camino a seguir. – BalusC

+0

Definitivamente corregiría en mi publicación, pero esta vez esperaba la respuesta a mi comentario, que es completamente diferente :). –

93

Eche un vistazo a la documentación para HttpServletRequest.
el fin de construir la dirección URL en el ejemplo, usted tendrá que utilizar:

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

Aquí es un método que le devolverá la 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 de servidor sea localhost? –

+0

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 dejarte saber. intente request.getRequestURL(). toString() y masajee si necesita –

+0

@MahmoudSaleh 'request.getLocalAddr()' – bluish

1

El siguiente código puede ser útil para la aplicación web que utiliza JavaScript.

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

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

Si está siendo pasado una URL como una cadena y desea extraer la raíz de contexto de esta solicitud, se puede utilizar esta expresión regular para extraerlo. Funcionará para las URL completas o las URL relativas que comiencen con la raíz de contexto.

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