HttpServletRequest para completar la URL

Tengo un objeto HttpServletRequest .

¿Cómo obtengo la URL completa y exacta que hizo que esta llamada llegue a mi servlet?

O al menos con la mayor precisión posible, ya que tal vez haya cosas que se pueden regenerar (el orden de los parámetros, tal vez).

El HttpServletRequest tiene los siguientes métodos:

  • getRequestURL() – devuelve la parte de la URL completa antes del carácter separador de cadena de consulta ?
  • getQueryString() – devuelve la parte de la URL completa después del carácter separador de cadena de consulta ?

Entonces, para obtener la URL completa, simplemente hazlo:

 public static String getFullURL(HttpServletRequest request) { StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString()); String queryString = request.getQueryString(); if (queryString == null) { return requestURL.toString(); } else { return requestURL.append('?').append(queryString).toString(); } } 

Yo uso este método:

 public static String getURL(HttpServletRequest req) { String scheme = req.getScheme(); // http String serverName = req.getServerName(); // hostname.com int serverPort = req.getServerPort(); // 80 String contextPath = req.getContextPath(); // /mywebapp String servletPath = req.getServletPath(); // /servlet/MyServlet String pathInfo = req.getPathInfo(); // /a/b;c=123 String queryString = req.getQueryString(); // d=789 // Reconstruct original requesting URL StringBuilder url = new StringBuilder(); url.append(scheme).append("://").append(serverName); if (serverPort != 80 && serverPort != 443) { url.append(":").append(serverPort); } url.append(contextPath).append(servletPath); if (pathInfo != null) { url.append(pathInfo); } if (queryString != null) { url.append("?").append(queryString); } return url.toString(); } 
 // http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789 public static String getUrl(HttpServletRequest req) { String reqUrl = req.getRequestURL().toString(); String queryString = req.getQueryString(); // d=789 if (queryString != null) { reqUrl += "?"+queryString; } return reqUrl; } 

HttpUtil está en desuso, este es el método correcto

 StringBuffer url = req.getRequestURL(); String queryString = req.getQueryString(); if (queryString != null) { url.append('?'); url.append(queryString); } String requestURL = url.toString(); 

Combinando los resultados de getRequestURL() y getQueryString() debería obtener el resultado deseado.

En un proyecto de spring puedes usar

 UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString() 

Puedes usar filtro

 @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest test1= (HttpServletRequest) arg0; test1.getRequestURL()); it gives http://localhost:8081/applicationName/menu/index.action test1.getRequestURI()); it gives applicationName/menu/index.action String pathname = test1.getServletPath()); it gives //menu/index.action if(pathname.equals("//menu/index.action")){ arg2.doFilter(arg0, arg1); // call to urs servlet or frameowrk managed controller method // in resposne HttpServletResponse httpResp = (HttpServletResponse) arg1; RequestDispatcher rd = arg0.getRequestDispatcher("another.jsp"); rd.forward(arg0, arg1); } 

No olvide poner FORWARD en la asignación de filtros en web.xml

Utilice los siguientes métodos en el objeto HttpServletRequest

java.lang.String getRequestURI () -Returna la parte de la URL de esta solicitud desde el nombre del protocolo hasta la cadena de consulta en la primera línea de la solicitud HTTP.

java.lang.StringBuffer getRequestURL () -Reconstruye la URL que el cliente utilizó para realizar la solicitud.

java.lang.String getQueryString (): restablece la cadena de consulta que está contenida en la URL de solicitud después de la ruta.

Un poco tarde para la fiesta, pero lo incluí en mi biblioteca MarkUtils-Web en WebUtils – Checkstyle-approved y JUnit-tested:

 import javax.servlet.http.HttpServletRequest; public class GetRequestUrl{ /** * 

A faster replacement for {@link HttpServletRequest#getRequestURL()} * (returns a {@link String} instead of a {@link StringBuffer} - and internally uses a {@link StringBuilder}) * that also includes the {@linkplain HttpServletRequest#getQueryString() query string}.

*

https://gist.github.com/ziesemer/700376d8da8c60585438

* @author Mark A. Ziesemer * <www.ziesemer.com> */ public String getRequestUrl(final HttpServletRequest req){ final String scheme = req.getScheme(); final int port = req.getServerPort(); final StringBuilder url = new StringBuilder(256); url.append(scheme); url.append("://"); url.append(req.getServerName()); if(!(("http".equals(scheme) && (port == 0 || port == 80)) || ("https".equals(scheme) && port == 443))){ url.append(':'); url.append(port); } url.append(req.getRequestURI()); final String qs = req.getQueryString(); if(qs != null){ url.append('?'); url.append(qs); } final String result = url.toString(); return result; } }

Probablemente la respuesta más rápida y sólida aquí detrás de la de Mat Banik, pero incluso la suya no tiene en cuenta las posibles configuraciones de puerto no estándar con HTTP / HTTPS.

Ver también: