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 больше не используется и был удален. (Маркт)