2011-07-09 23 views
7

Tengo un archivo JSP, que incluye otro archivo JSP para comprobar algunos valores y dicho:response.sendRedirect() de jsp: ¿incluir ser ignorado?

<jsp:include page="setup.jsp" />

Dentro de la setup.jsp Tengo algo de código condicional que determina si algunos valores son necesarios establecer en la sesión y si no los redirige a una página diferente. O al menos se supone que debe hacerlo, pero la redirección parece estar siendo ignorada.

System.err.println("Redirecting!"); 
response.sendRedirect("http://www.google.com"); 
return; 

Veo "Redirecting!" inicie sesión en la consola, pero la página continúa y se procesa normalmente. Tuve curl dump los encabezados para mí y vi que la respuesta es HTTP/1.1 200 OK por lo que definitivamente no está enviando un redireccionamiento 302.

¿Alguna idea de cuál es el problema y cómo puedo solucionarlo?

EDIT: he verificado que mi respuesta aún no está confirmada. response.isCommitted() devuelve false lo que significa que el código de estado y los encabezados aún no se han enviado.

EDIT 2: Intenté llamar al response.sendRedirect() en muchos otros lugares y descubrí que puedo redirigir con éxito antes de. Parece que se ignora la redirección dentro del JSP y si trato de redirigir a la derecha DESPUÉS del jsp, recibo una excepción de estado ilegal porque la respuesta ya se ha confirmado.

+1

Existe la posibilidad de que parte de la respuesta ya se haya enviado al cliente y se ignore la redirección. La redirección debería ser (casi) lo primero que se analizará. – Augusto

+0

Tengo que ajustar esto dentro de una estructura de aplicación web mucho más grande, por lo que mis manos están atadas cuando se trata de cuándo y dónde puedo colocar el código para hacer la redirección. ¿Hay alguna manera de probar para ver si la respuesta ya ha sido entregada al navegador cuando estoy tratando de hacer mi redirección? ¿Tiene alguna sugerencia de cómo puedo iniciar algún tipo de redirección cuando estoy enterrado en jsp: incluye? –

+0

Agregué un mensaje out.println() simple a la ubicación a la que llamo redirigir y ese resultado aparece antes que cualquier otro resultado de la respuesta. Entonces, ¿no debería poder redirigir en ese punto? –

Respuesta

11

El <jsp:include> se utiliza bajo las cubiertas RequestDispatcher#include(). Haga clic en el enlace para ver el javadoc. He aquí un extracto de relevancia (el énfasis es mío):

...

El objeto ServletResponse tiene sus elementos de ruta y los parámetros permanecen sin cambios desde la persona que llama de. El servlet incluido no puede cambiar el código de estado de respuesta ni establecer encabezados; cualquier intento de hacer un cambio es ignorado.

...

El HttpServletResponse#sendRedirect() establece básicamente el estado de respuesta HTTP para 302 y la cabecera HTTP Location a la dirección URL de destino. Por lo tanto, es totalmente ignorado.

El problema más grave es que está abusando de JSP como controlador/filtro de página. En realidad, debería utilizar una clase servlet o filter normal para esto, que se ejecuta mucho antes que JSP.

+0

Estoy totalmente de acuerdo con el abuso, desafortunadamente estoy obligado a encajar dentro de unos límites muy estrictos. Gracias por el fragmento de documento anterior, no tenía idea. –

+0

De nada. – BalusC

0

El encabezado de redirección (creo) debe estar en la parte superior de la página. Ver las especificaciones HTML para referencia.

¿Ha intentado colocarlo en la parte superior de la página? Un ejemplo de código nos ayudaría a depurar ...

+0

Desafortunadamente, no puedo proporcionar muchos fragmentos de código debido a problemas de privacidad para mi cliente. Es un sitio bastante complejo con múltiples niveles de jsp: incluye y tal. –

+0

He verificado que no se ha enviado ningún código de estado u otros encabezados en el momento en que intento redirigir, por lo que se encuentra efectivamente en la parte superior de la página. –