Местоположение ошибки всегда из корня сайта?

#spring #servlets #web.xml

#spring #сервлеты #web.xml

Вопрос:

У меня есть этот XML в моем web.xml файле:

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

Если я перехожу на страницу, подобную /indexer (которая не существует), то я правильно перенаправляюсь на URL /error/html/404 . Если я перехожу на страницу, подобную /index/nope (которая также не существует), то я открываю пустую страницу и URL читается /index/error/html/404 . Что я могу поместить в location тег, чтобы всегда получать правильный URL, независимо от того, с чего я начал?

Ответ №1:

Это ненормальное поведение. Это определенно должно быть относительно корня контекста. Я цитирую страницу 154 спецификации Servlet 3.0:

Подэлемент location элемент содержит местоположение ресурса в веб-приложении относительно корня веб-приложения. Значение местоположения должно иметь начальный ‘/’ .

Ваша проблема вызвана ошибкой в используемом servletcontainer. Сообщите об этом и / или обновите до последней версии. Или, возможно, у вас плохой Filter перехват в ERROR dispatcher для шаблона URL, /* который использует RequestDispatcher#forward() неправильно.


Обновление согласно комментариям, вы используете Tomcat 7.0.16, который является контейнером, совместимым с Servlet 3.0. Хотя ваш web.xml объявлен соответствующим Servlet 2.5 вместо 3.0, я не могу воспроизвести вашу проблему с обеими web.xml версиями на моем локальном Tomcat 7.0.11, 7.0.19 или 7.0.22. Кроме того, URL-адрес здесь в адресной строке браузера не меняется (и не должен меняться). В адресной строке браузера остается только исходный (неправильный) URL. Это заставляет меня думать, что это, скорее всего, вызвано плохим фильтром или, возможно, сервлетом переднего контроллера, который сопоставлен со слишком общим шаблоном URL /* и отправляет перенаправление на неправильный URL. Проверьте наличие такого фильтра или сервлета в вашем веб-приложении, отладьте и исправьте его соответствующим образом.

Комментарии:

1. Если я правильно понимаю, что вы говорите: мой XML в порядке, проблема в контейнере Spring servlet?

2. Spring — это (среди прочего) платформа DI, а не servletcontainer. Вы развертываете веб-приложение в servletcontainer. Например, Tomcat 7.0.22, Glassfish 3.1.1, JBoss AS 6.0.0 и т.д. Знание точной марки / версии servletcontainer было бы полезно для того, чтобы подробнее разобраться в проблеме и / или попытаться воспроизвести ее и / или сообщить о ней соответствующим образом. Также было бы полезно сообщить, для какой версии API сервлета объявлен ваш web.xml .

3. Я использую Apache Tomcat 7.0.16, и мой web.xml начинается с <web-app version="2.5" ...> . xsi:schemaLocation Также указывает на 2.5.

4. Спасибо. У меня нет 7.0.16 на руках, но я не могу воспроизвести вашу проблему ни в 7.0.22, ни в 7.0.11, которые у меня есть здесь (также не в 7.0.19). Смотрите обновление ответа.