Как получить сообщение на пользовательской странице ошибки (Tomcat)? - PullRequest
26 голосов
/ 15 июня 2009

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

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

Ответы [ 6 ]

13 голосов
/ 23 июня 2009

Сообщение об ошибке доступно через атрибут javax.servlet.error.message объекта запроса на странице ошибки jsp.

Вот синтаксис jsp для доступа к нему:

<c:out value="${requestScope['javax.servlet.error.message']}"/>

Вы можете найти другую информацию об ошибках, доступную на странице ошибок здесь в Новые атрибуты ошибок .

9 голосов
/ 15 июня 2009

Хмм exception.getMessage() должно работать

Попробуйте добавить exception.getClass().getName()

  1. Это может быть NullPointerException, в котором нет сообщения
  2. или исключение не из 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 голосов
/ 19 апреля 2013

Прошу прощения за столь поздний ответ, но я столкнулся с этой проблемой всего неделю назад, я просмотрел много разных сайтов, но никто так и не ответил на эту проблему так, как я хотел услышать. В этом посте я узнал несколько интересных решений, а затем пришел к своим собственным. Просто включите этот источник на своей странице:

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

Со мной все прекрасно работало.

0 голосов
/ 25 декабря 2016

Вы можете использовать

${requestScope['javax.servlet.error.message']}

если у вас нет jstl на странице

0 голосов
/ 22 июня 2009

exception часть ErrorData будет установлена, только если страница ошибки была загружена в результате исключения, а не кода ошибки ответа.

См. javadoc для sendError на HttpServletResponse. В нем упоминается, почему вы не видите сообщение, которое вы передали sendError (выделено мной):

Отправляет ответ об ошибке клиенту, используя указанный статус. По умолчанию сервер создает ответ, похожий на страницу ошибок сервера в формате HTML, содержащую указанное сообщение, устанавливает тип содержимого «text / html», оставляя файлы cookie и другие заголовки без изменений. Если для веб-приложения было сделано объявление об ошибке, соответствующее переданному коду состояния, оно будет возвращено в предпочтение предложенному параметру msg.

Если ответ уже был принят, этот метод генерирует исключение IllegalStateException. После использования этого метода ответ должен считаться принятым и не должен записываться.

0 голосов
/ 16 июня 2009

То, что вы хотите, выглядит странно для меня :). Тем не менее, я бы сделал следующее:

  1. Реализуйте HttpResponseWrapper, чтобы обернуть любое другое HttpResponse таким образом:

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. Создать фильтр и обернуть любой ответ в этом

  3. Поставить фильтр на все запросы и первым в цепочке

  4. На странице ошибки проверьте, является ли ответ instanceof HttpResponseWrapper

  5. Получите ваше сообщение

...