【问题标题】:Override the HTTP response status text覆盖 HTTP 响应状态文本
【发布时间】:2014-01-08 07:16:19
【问题描述】:

如何在 Tomcat 7 中覆盖 HttpStatus 的文本。

我正在使用HttpServletResponse.sendError(401, "Invalid username or Password"),但是当我查看客户端中的响应状态时,它会显示401 Unauthorized

有没有办法覆盖它?

【问题讨论】:

标签: java tomcat servlets httpresponse


【解决方案1】:

Tomcat 不再支持 USE_CUSTOM_STATUS_MSG_IN_HEADER 属性。

来自8.5.0的更新日志:

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

RFC 7230,超文本传输​​协议 (HTTP/1.1):消息语法和路由,2014 年 6 月。Section 3.1.2

reason-phrase 元素存在的唯一目的是提供 与数字状态代码相关的文本描述, 主要是出于对早期互联网应用协议的尊重 更频繁地与交互式文本客户端一起使用。 一个 客户应该忽略原因短语内容

【讨论】:

    【解决方案2】:

    编辑catalina.properties并添加属性:

    org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true
    

    在我的开发环境中设置,然后当我这样做时:

    response.sendError(HttpServletResponse.SC_BAD_REQUEST, 
                       "A very very very bad request");
    

    我明白了:

    HTTP/1.1 400 A very very very bad request
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=utf-8
    Content-Language: en
    Content-Length: 1024
    Date: Fri, 20 Dec 2013 11:09:54 GMT
    Connection: close
    

    还讨论了herehere

    【讨论】:

    • 这可能不相关,但某些客户端(例如 iOS Safari 不会尊重您的自定义 responseText)
    【解决方案3】:

    否 - 响应代码根据 RFC 2616 设置。如果您想向用户(API 客户端)传达消息,请将其写入正文或响应标头中

    【讨论】:

    • 没错,响应代码在 RFC 中指定,但“原因短语”(这是问题所在)可以是您喜欢的任何内容。 (见rfc2616 section 6.1.1“这里列出的原因短语只是建议——它们可以被本地等效替换而不影响协议。”
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2011-11-30
    • 2017-01-30
    • 2013-12-10
    相关资源
    最近更新 更多