2011-09-19 30 views
10

Estoy redirigiendo errores 404 a un servlet a través de lo siguiente en mi web.xml.web.xml 404 redirigir a servlet, cómo obtener el URI original?

<error-page> 
    <error-code>404</error-code> 
    <location>/notFound.do</location> 
</error-page> 

me gustaría que entrar cuando la solicitud estaba tratando de ir, pero ahora no recibo desde el encabezado de referencia: request.getHeader ("árbitro")

que muestra 'nulo' si acabo de golpear cualquier página aleatoria que no exista.

Y request.getRequestURL()/request.getRequestURI() ambos solo muestran la información final del servlet de aterrizaje (es decir,/notFound).

¿Alguna manera de obtener la URL de página "incorrecta" que se solicitó?

Respuesta

18

Sí, está disponible como un atributo de solicitud con el nombre javax.servlet.forward.request_uri, que está codificado por RequestDispatcher#FORWARD_REQUEST_URI. La ubicación de la página de error se invoca mediante una simple llamada RequestDispatcher#forward().

Por lo tanto, se puede conseguir de la siguiente manera en el servlet:

String originalUri = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); 

o en EL:

<p>Original URI: ${requestScope['javax.servlet.forward.request_uri']}</p> 
+0

parece que el servlet-api.jar (que proporciona javax.servlet.RequestDispatcher) en mi instalación de Tomcat 7.0.19 no tiene ninguno de esos campos estáticos; solo los métodos 'forward' e 'include'. Pero puedo hacer que funcione si solo pongo el hilo directamente. Por ejemplo, los siguientes trabajos. request.getAttribute ("javax.servlet.forward.request_uri") Gracias por su ayuda! –

+1

Definitivamente está presente allí (haga clic en los enlaces en mi respuesta para ver los javadocs). Este problema sugiere que ha configurado su IDE para tratar su proyecto como un proyecto de Servlet 2.4 o anterior, o que está confiando en su classpath compiletime en un archivo 'servlet-api.jar' de versiones anteriores y antiguas que se encuentra en otro lugar. ¿Estás usando Eclipse? Si es así, lea esto: http://stackoverflow.com/questions/4076601/how-do-i-import-the-javax-servlet-api-in-my-eclipse-project/4076706#4076706 – BalusC

+0

Weird. Abrí el servlet-api.jar y eché un vistazo al código de bytes RequestDispatcher.class, y veo FORWARD_REQUEST_URI allí (así como las otras constantes). Pero abrir la declaración dentro de Eclipse solo muestra los dos métodos. Ambos apuntan al mismo contenedor en el disco ... –

Cuestiones relacionadas