Как сделать пользовательскую страницу 404 переадресацией, а не переадресацией в Tomcat

У меня есть приложение Spring MVC, обслуживаемое в Tomcat. Когда пользователь входит на страницу, которая не найдена, он отображает мою страницу 404 по умолчанию, как указано в web.xml

<error-page>
   <error-code>404</error-code>
   <location>/errors/404/</location>
</error-page>

Проблема в том, что если пользователь переходит на http://mydomain/bad/url

он перенаправляется на http://mydomain/errors/404/

Это раздражает, потому что, если пользователь вводит неправильный URL-адрес, трудно увидеть, в чем была ошибка, и исправить ее.

После ошибки 404 я бы хотел сохранить исходный URL-адрес, но отображать страницу с ошибкой. (т.е. перенаправление, а не перенаправление). Это мое впечатление о том, как работает большинство веб-серверов. Это возможно?


person Will Glass    schedule 18.10.2010    source источник
comment
Если ваша цель — получить исходный URL-адрес, вызвавший ошибку 404, вам не подойдет req.getAttribute(javax.servlet.error.request_uri)?   -  person JoseK    schedule 19.10.2010
comment
Хороший совет - не знал об этом. Но моя цель — удобство для пользователя. Я хочу, чтобы URL-адрес оставался с неверным значением, чтобы пользователи могли его видеть, но доставлял страницу с ошибкой.   -  person Will Glass    schedule 20.10.2010
comment
Вы бы сами ответили и закрыли вопрос? С уважением.   -  person Martín Schonaker    schedule 31.05.2011


Ответы (1)


Я не совсем понимаю, почему это работает именно так, но...

Я обнаружил, что если вы установите код состояния и получите пустой ответ (или если вы попытаетесь перейти на страницу с ошибкой), Tomcat перенаправит на страницу с ошибкой:

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);

Но если вы попросите Tomcat отправить страницу, он просто перешлет и оставит URL-адрес в исходном состоянии, как я и ищу.

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);
((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND);
person Will Glass    schedule 12.06.2011
comment
Вы должны просто вызвать sendError(). Он устанавливает статус. Используйте setStatus(), только если вы также собираетесь предоставлять контент. - person Lawrence Kesteloot; 08.03.2012