tomcat не показывает сообщение об ошибке при использовании sendError из сервлета

ОК, поэтому у меня есть довольно простой webapp с помощью сервлета, и в некоторых случаях я отправляю и ошибку обратно клиенту, как:

response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Did not specify parameter xyz");

это работает нормально в целом, но Tomcat (6.0.33 и Java 1.6.0_26-b03) не показывает данное сообщение об ошибке сверху.

Если я запускаю приложение на другом контейнере, таком как glassfish, отображается данное сообщение.

Итак, пример вывода ....

Tomcat:
400 - Bad Request

Glassfish:
400 - Did not specify parameter xyz

можно ли настроить tomcat для поведения в так же?

3 ответов


Ok после еще нескольких раскопок я нашел решение здесь:Как правильно отправить HTTP-сообщение клиенту

вам нужно установить:

org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = true

in/conf / catalina.свойства

это заставляет tomcat отправлять сообщение об ошибке, установленное в заголовках "правильно":)


возможно, вы хотите создать пользовательскую страницу ошибок, например 400.jsp, и поместите его в сеть.xml как

<error-page>
   <error-code>400</error-code>
.. . path to the page (sorry I don't remember the exact syntax)
</error-page>

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

UPD: если вам не нравятся пользовательские страницы err: мы использовали этот код в RESTful API для отправки ответа пользователя с ошибкой и сообщением

return javax.ws.rs.core.Response.status(Status.BAD_REQUEST).entity("My message here).build();

Tomcat больше не поддерживает USE_CUSTOM_STATUS_MSG_IN_HEADER собственность.

список изменений версия 8.5.0:

RFC 7230 заявляет, что клиенты должны игнорировать фразы причины в HTTP / 1.1 ответное сообщение. Поскольку фраза причины является необязательной, Tomcat нет дольше отправляет. В результате свойство system орг.апаш.койот.USE_CUSTOM_STATUS_MSG_IN_HEADER больше не используется и был удален. (Маркт)