2011-07-09 17 views
7

Mam pliku JSP, który zawiera inny plik JSP sprawdzić niektóre wartości i takie:response.sendRedirect() from jsp: include being ignored?

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

Wewnątrz setup.jsp Mam trochę kod warunkowy, który określa, czy pewne wartości są potrzebne ustawić w sesji i jeśli nie przekieruje ich na inną stronę. A przynajmniej tak powinno być, ale przekierowanie wydaje się być ignorowane.

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

Widzę "Przekierowanie!" logować się do konsoli, ale strona kontynuuje i renderuje się normalnie. Miałem zwinięte nagłówki dla mnie i zobaczyłem, że odpowiedź jest HTTP/1.1 200 OK, więc zdecydowanie nie wysyła przekierowania 302.

Każdy pomysł, jaki jest problem i jak mogę to naprawić?

EDYCJA: Potwierdziłem, że moja odpowiedź nie została jeszcze zatwierdzona. response.isCommitted() zwraca false co oznacza, że ​​kod statusu i nagłówki nie zostały jeszcze wysłane.

EDIT 2: Próbowałem dzwonić pod numer response.sendRedirect() w wielu innych miejscach i stwierdziłem, że mogę z powodzeniem przekierować przed. Przekierowanie wewnątrz strony JSP wydaje się być ignorowane i jeśli spróbuję przekierować bezpośrednio PO JSP, otrzymam niedozwolony wyjątek stanu, ponieważ odpowiedź została już zatwierdzona.

+1

Istnieje szansa, że ​​część odpowiedzi zostanie wysłana bezpośrednio do klienta, a przekierowanie zostanie zignorowane. Przekierowanie powinno być (prawie) pierwszą rzeczą do przeanalizowania. – Augusto

+0

Muszę zmieścić to w znacznie większej strukturze aplikacji internetowej, więc moje ręce są związane, kiedy i gdzie mogę umieścić kod, aby wykonać przekierowanie. Czy istnieje sposób, w jaki mogę przetestować, czy odpowiedź jest już dostarczona do przeglądarki, gdy próbuję wykonać przekierowanie? Czy masz jakieś sugestie, w jaki sposób mogę zainicjować przekierowanie, gdy jestem pochowany w jsp: zawiera? –

+0

Dodałem prostą wiadomość out.println() do miejsca, w którym dzwonię przekierowanie i że wyjście pojawia się przed każdym innym wyjściem z odpowiedzi. Czy nie powinienem mieć możliwości przekierowania w tym momencie? –

Odpowiedz

11

Zastosowania pod pokrywami RequestDispatcher#include(). Kliknij link, aby wyświetlić javadoc. Oto wyciąg z kopalni znaczenie (nacisk):

...

Przedmiotem ServletResponse ma swoje elementy i parametry ścieżki pozostają niezmienione od rozmówcy. Dołączony serwlet nie może zmienić kodu statusu odpowiedzi ani ustawić nagłówków; każda próba wprowadzenia zmiany jest ignorowana.

...

The HttpServletResponse#sendRedirect() zasadzie ustawia stan odpowiedzi HTTP do 302 i nagłówek do docelowego adresu URL HTTP Location. Jest to całkowicie ignorowane.

Głębszym problemem jest nadużywanie strony JSP jako kontrolera stron/filtra. W rzeczywistości powinieneś używać normalnej klasy servlet lub filter, która działa znacznie wcześniej niż JSP.

+0

Całkowicie zgadzam się z nadużyciem, niestety muszę się zmieścić w bardzo surowych granicach. Dziękuję za powyższy fragment, nie miałem pojęcia. –

+0

Nie ma za co. – BalusC

0

Przekierowanie nagłówka (chyba) musi znajdować się u góry strony. Wyświetl specyfikację HTML w celach informacyjnych.

Czy próbowałeś umieścić go na samej górze strony? Próbka kodu pomogłaby nam w debugowaniu ...

+0

Niestety, nie mogę podać zbyt wielu fragmentów kodu z powodu obaw o prywatność mojego klienta. Jest to dość złożona strona z wieloma poziomami jsp: zawiera i tym podobne. –

+0

Weryfikowałem, że żaden kod statusu ani inne nagłówki nie zostały wysłane w czasie, gdy próbuję przekierować, więc jest to skutecznie "u góry strony". –