Как получить сообщение на странице пользовательской ошибки (Tomcat)?
В JSP вы можете использовать response.sendError(int code, String message)
для возврата определенного кода ошибки (например, 404 для не найденного) и сообщения.
Эти сообщения отображаются в порядке, если вы используете уродливые страницы ошибок Tomcat по умолчанию. Однако, если вы создадите страницу пользовательских ошибок, как вы получите это сообщение?
Я пробовал exception.getMessage()
или pageContext.getErrorData()
, но безрезультатно. Я искал это как часы, и никто, кажется, даже не задается вопросом о том же!: S
Я забыл упомянуть, что я только пробовал его с 404s до сих пор, так как это то, что мне нужно больше всего... Исключение по какой-то причине является нулевым, поэтому попытка что-либо на нем генерирует исключение NullPointerException.
Страница ошибки - это страница ошибки 404, заданная через web.xml(так как я хочу, чтобы она отображалась для КАЖДОЙ одиночной ошибки 404), и для кого-то интересно, да, она имеет директиву isErrorPage, установленную в true...
Ответы
Ответ 1
Сообщение об ошибке доступно через атрибут javax.servlet.error.message
объекта запроса на странице jsp ошибки.
Вот синтаксис jsp для доступа к нему:
<c:out value="${requestScope['javax.servlet.error.message']}"/>
Вы можете найти другую информацию об ошибке, доступную на странице ошибки здесь в разделе "Атрибуты новой ошибки".
Ответ 2
Hmm exception.getMessage()
должен работать
Попробуйте добавить exception.getClass().getName()
- Это может быть
NullPointerException
, у которого нет сообщения
- или исключение не от Sun, и сообщение не установлено должным образом
Конечно, это работает, если я правильно помню, если ошибка вызывается jsp с <%@ page errorPage="/yourerrorpage.jsp" %>
вверху.
Если ошибка возникает из сервлета, детали исключения передаются как атрибуты запроса
javax.servlet.error.status_code java.lang.Integer
javax.servlet.error.exception_type java.lang.Class
javax.servlet.error.message java.lang.String
javax.servlet.error.exception java.lang.Throwable
javax.servlet.error.request_uri java.lang.String
javax.servlet.error.servlet_name java.lang.String
Проверьте Спецификация сервлета, раздел 9.9
Ответ 3
Мне жаль, что я так поздно ответил, но неделю назад я столкнулся с этой проблемой, я просмотрел множество разных сайтов, но никто не задавал эту проблему так, как я хотел услышать. В этом посте я узнал несколько интересных решений, а затем подошел сам. Просто включите этот источник на свою страницу:
<%
out.println(pageContext.getErrorData().getRequestURI());
out.println("<br/>");
out.println(pageContext.getErrorData().getStatusCode());
out.println("<br/>");
out.println(pageContext.getException());
out.println("<br/>");
%>
Это сработало отлично со мной.
Ответ 4
Вещь, которую вы хотите, выглядит странно для меня:). Тем не менее, я бы сделал следующее:
-
Внесите HttpResponseWrapper
, чтобы обернуть любой другой HttpResponse
таким образом:
public class HttpResponseWrapper implements HttpResponse {
private String errorMessage;
...
@Override
public void sendError(...) {
<save error message here>
}
...
}
-
Создайте фильтр и оберните любой ответ в этом
-
Поместите фильтр во все запросы и сначала в цепочку
-
На странице с ошибкой проверьте, является ли ответ экземпляром HttpResponseWrapper
-
Получите ваше сообщение
Ответ 5
Часть exception
ErrorData
будет установлена, только если страница с ошибкой была загружена в результате исключения, а не кода ошибки ответа.
Смотрите javadoc для sendError
в HttpServletResponse
. В нем упоминается, почему вы не видите сообщение, которое вы передали sendError
(выделение мое):
Отправляет ответ об ошибке клиенту с использованием указанного состояния. Сервер по умолчанию создает ответ, чтобы он выглядел как страница с ошибкой сервера HTML, содержащая указанное сообщение, устанавливая тип содержимого "text/html", оставляя файлы cookie и другие заголовки неизмененными. Если для веб-приложения, соответствующего переданному коду состояния, было сделано объявление страницы с ошибкой, оно будет возвращено в предпочтение предложенному параметру msg.
Если ответ уже выполнен, этот метод генерирует исключение IllegalStateException. После использования этого метода ответ следует считать совершенным и не должен записываться.
Ответ 6
Вы можете использовать
${requestScope['javax.servlet.error.message']}
если у вас нет jstl на странице