Подтвердить что ты не робот

Как получить сообщение на странице пользовательской ошибки (Tomcat)?

В JSP вы можете использовать response.sendError(int code, String message) для возврата определенного кода ошибки (например, 404 для не найденного) и сообщения. Эти сообщения отображаются в порядке, если вы используете уродливые страницы ошибок Tomcat по умолчанию. Однако, если вы создадите страницу пользовательских ошибок, как вы получите это сообщение? Я пробовал exception.getMessage() или pageContext.getErrorData(), но безрезультатно. Я искал это как часы, и никто, кажется, даже не задается вопросом о том же!: S

Я забыл упомянуть, что я только пробовал его с 404s до сих пор, так как это то, что мне нужно больше всего... Исключение по какой-то причине является нулевым, поэтому попытка что-либо на нем генерирует исключение NullPointerException. Страница ошибки - это страница ошибки 404, заданная через web.xml(так как я хочу, чтобы она отображалась для КАЖДОЙ одиночной ошибки 404), и для кого-то интересно, да, она имеет директиву isErrorPage, установленную в true...

4b9b3361

Ответ 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 на странице