barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 25 мая 2012 г.

Tomcat: получение URL`а оригинальной запрошенной страницы со страницы-обработчика ошибки 404

Задача:

Установлена кастомная 404-страница для веб-приложения:
<error-page>
<error-code>404</error-code>
<location>/errorPages/404.jsp</location>
</error-page> 
В теле страницы необходимо определить, какой именно URL привел к ошибке (как минимум, это необходимо, чтобы корректно подключить стили на этой странице, т.к. для этого нужно знать уровень вложенности).

Решение:

При возникновении ошибки 404 Tomcat делает forward на установленную 404-страницу, поэтому определить, какой именно URL пользователь запросил, не так просто (request.getRequestURI() возвращает /errorPages/404.jsp). Определение именно запрошенного пользователем URL`а выполняется так:
request.getAttribute("javax.servlet.error.request_uri")
Аналогичным образом можно узнать и другие параметры ошибки через следующие атрибуты:
javax.servlet.error.status_code
javax.servlet.error.exception_type
javax.servlet.error.message
javax.servlet.error.exception 
Такой подход работает не только на JSP-страницах, но и в сервлетах (см. http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/).
Теперь уровень вложенности страницы, вызвавшей 404 ошибку, относительно контекста сервлета определяется следующим образом:
request.getAttribute("javax.servlet.error.request_uri").toString().split("/").length-3

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

Отправить комментарий