【问题标题】:tomcat does not show error message when sendError used from servlet当从 servlet 使用 sendError 时,tomcat 不显示错误消息
【发布时间】:2011-12-31 17:41:01
【问题描述】:

好的,所以我有一个使用 Servlet 的非常简单的 web 应用程序,在某些情况下,我会向客户端发送错误消息,例如:

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 配置为以相同的方式运行?

【问题讨论】:

  • 您的项目中是否设置了自定义错误页面?
  • 否;没有自定义错误页面。它仍然显示tomcat默认的自定义HTML页面,并且我发送的消息在那里可见。 Glassfish 的行为方式相同。但它也使用该消息作为返回的基本错误消息,而 tomcat 仍然使用“错误请求”。
  • 我之所以问这个问题是因为 Tomcat 6.0.X 存在一个错误,即当涉及自定义错误页面时,无法使用“sendError”发送自定义消息。
  • 嗯,我没有在我的 web.xml 中指定任何内容,也没有在默认 web.xml 中看到任何内容,但我会仔细检查,感谢您指出这一点。
  • 没问题。另外为了进一步参考检查这个页面...issues.apache.org/bugzilla/show_bug.cgi?id=42409

标签: java tomcat servlets


【解决方案1】:

好吧,经过一番挖掘,我在这里找到了解决方案:How to properly send an HTTP message to the client

你需要设置:

org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = true

在 /conf/catalina.properties 中

这会导致 tomcat 发送您在标题中设置的错误消息“正确”:)

【讨论】:

    【解决方案2】:

    Tomcat 不再支持 USE_CUSTOM_STATUS_MSG_IN_HEADER 属性。

    来自version 8.5.0的更新日志:

    RFC 7230 规定客户端应忽略 HTTP/1.1 中的原因短语 响应消息。由于原因短语是可选的,因此 Tomcat 没有 再发送它。结果系统属性 org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER 不再使用 并已被删除。 (市场)

    【讨论】:

    • 是的.. 有什么建议吗?
    【解决方案3】:

    也许您想创建一个自定义错误页面,例如 400.jsp,并将其放在 web.xml 中

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

    在此错误页面上,您可以获得此消息并将其显示给用户。 自定义错误页面的好处是您可以应用自己的 css 样式、特定于站点的标记等。

    统一更新: 如果您不喜欢自定义错误页面: 我们在 RESTful API 中使用此代码将错误和消息发送回用户响应

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

    【讨论】:

    • 自定义错误页面在这里并不是真正正确的解决方案。 servlet 提供一个 RESTful API,所以我只是在给它发帖等,用户实际上从未被重定向到错误页面。因此,当我在 POST 上收到错误而不是显示有意义的消息时,针对 tomcat,它只会收到“错误请求”:(
    • 那么将用户重定向到漂亮的错误页面有什么问题?如果您在 web.xml 中指定它,它将自动完成,因此无需编写任何其他编码
    • 这是一个 API,不是典型的网站。 API 不会重定向。其他客户端应用程序对 API 进行 RESTful 调用并适当地处理响应。由于 tomcat 的这种行为方式,他们无法从 API 返回正确的错误消息。
    • 添加了更新来回答..对不起第一个误解
    • 不用担心,谢谢回复 :) 我们没有使用标准的 ws 东西,所以这不起作用,但我还是在 tomcat 中找到了设置,我知道它必须在某个地方进行配置!
    猜你喜欢
    • 2019-01-30
    • 2019-09-08
    • 1970-01-01
    • 2020-07-28
    • 2018-12-19
    • 1970-01-01
    • 2012-09-15
    • 2017-07-16
    相关资源
    最近更新 更多