2009-08-10 54 views
23

Por lo tanto, estoy intentando obtener la URL actual de la página utilizando el objeto de solicitud de Java. He estado utilizando request.getRequestURI() para preformar esto, pero me di cuenta de que cuando una clase java me redirecciona a una página diferente de una solicitud servlet getRequestURI da esa dirección en lugar de la URL original que se escribió en el navegador y que aún se muestra en el navegador.Java HttpServletRequest obtener URL en los navegadores Barra de URL

Ex: \ AdvancedSearch:
getRequestURI() devuelve "\ subdirectorio \ Search \ search.jsp"

estoy buscando una manera de captar lo que el navegador ve como la dirección URL y no lo que se conoce página solo un envoltorio de servlet.

+0

La respuesta en el siguiente enlace voluntad definitivamente ayuda a alguien [http://stackoverflow.com/questions/8024344/user-login-with-jsf-2-0/39379256#39379256](http://stackoverflow.com/questions/8024344/user-login-with-jsf -2-0/39379256 # 39379256) –

Respuesta

38

Si su solicitud actual proviene de un "dentro del servidor de aplicaciones" reenviar o incluir, se espera que el servidor de aplicaciones preserve la información de solicitud como atributos de solicitud. Los atributos específicos y lo que contienen dependen de si está haciendo un forward o un include.

Para <jsp:include>, la URL principal original será devuelto por request.getRequestURL(), e información sobre la página incluida se encontrará en la siguiente petición atributos:

 javax.servlet.include.request_uri 
    javax.servlet.include.context_path 
    javax.servlet.include.servlet_path 
    javax.servlet.include.path_info 
    javax.servlet.include.query_string 

Para <jsp:forward>, la nueva URL será devuelto por request.getRequestURL() y la información de la solicitud original se encuentra en la siguiente petición atributos:

 javax.servlet.forward.request_uri 
    javax.servlet.forward.context_path 
    javax.servlet.forward.servlet_path 
    javax.servlet.forward.path_info 
    javax.servlet.forward.query_string 

Estos se exponen en la sección 8.3 y 8.4 de la especificación Servlet 2.4.

Sin embargo, tenga en cuenta que esta información solo se conserva para las solicitudes enviadas internamente. Si tiene un servidor web front-end o un envío fuera del contenedor actual, estos valores serán nulos. En otras palabras, es posible que no tenga forma de encontrar la URL de solicitud original.

+0

Probé out.println (request.getAttribute ("request_uri")); \t out.println (request.getAttribute ("context_path")); \t out.println (request.getAttribute ("servlet_path")); \t out.println (request.getAttribute ("path_info")); \t fuera.println (request.getAttribute ("query_string")); Todos devueltos nulos. ¿Esto significa que estoy jodido? – Ballsacian1

+4

El nombre del atributo real es "javax.servlet.include.request_uri", no "request_uri" – kdgregory

+0

Gracias que funciona. Necesito agregar un poco más de lógica en mi navegación, pero bueno me ahorra un montón de problemas. Gracias. – Ballsacian1

5
String activePage = ""; 
    // using getAttribute allows us to get the orginal url out of the page when a forward has taken place. 
    String queryString = "?"+request.getAttribute("javax.servlet.forward.query_string"); 
    String requestURI = ""+request.getAttribute("javax.servlet.forward.request_uri"); 
    if(requestURI == "null") { 
     // using getAttribute allows us to get the orginal url out of the page when a include has taken place. 
     queryString = "?"+request.getAttribute("javax.servlet.include.query_string"); 
     requestURI = ""+request.getAttribute("javax.servlet.include.request_uri"); 
    } 
    if(requestURI == "null") { 
     queryString = "?"+request.getQueryString(); 
     requestURI = request.getRequestURI(); 
    } 
    if(queryString.equals("?null")) queryString = ""; 
    activePage = requestURI+queryString; 
2

$ {requestScope [ 'javax.servlet.forward.query_string']} - si accede a que forman JSP, utilizando lenguaje de expresión

8

Sólo hizo un ligero ordenada de la solución por Ballsacian1

String currentURL = null; 
if(request.getAttribute("javax.servlet.forward.request_uri") != null){ 
    currentURL = (String)request.getAttribute("javax.servlet.forward.request_uri"); 
} 
if(currentURL != null && request.getAttribute("javax.servlet.include.query_string") != null){ 
    currentURL += "?" + request.getQueryString(); 
} 

Las comprobaciones nulas se ejecutarán con mucha más eficacia que las comparaciones de cadenas.

+0

Gracias por esto. Aunque actualmente no me sirve mucho, esta es una de esas preguntas que estoy seguro de que volveré a hacer en el futuro. – Ballsacian1

+0

@readikus - ¿debería ser 'javax.servlet.forward.query_string' en lugar de' javax.servlet.include.query_string'? –

1

¿Se puede probar este

<%=request.getRequestURL().toString()%> 
1

Para obtener la ruta HTTP solicitada sin conocer el estado del flujo interno de la solicitud, utilice este método:

public String getUri(HttpServletRequest request) { 
    String r = (String) request.getAttribute("javax.servlet.forward.request_uri"); 
    return r == null ? request.getRequestURI() : r; 
}