如何正确地将HTTP消息发送到客户端

Ada*_*ume 40 java servlets http status java-ee

我正在使用Java的RESTful Web服务.如果出现问题,我需要一种向客户端发送错误消息的好方法.

根据Javadoc,由于消息参数含义模糊,HttpServletResponse.setStatus(int status, String message)因此不推荐使用.

是否有一种首选方式来设置响应的状态消息或" 原因短语 "?该sendError(int, String)方法没有这样做.

编辑:为了澄清,我想修改HTTP状态行,即"HTTP/1.1 404 Not Found"不是正文内容.具体来说,我想发送回复"HTTP/1.1 400 Missing customerNumber parameter".

Han*_*Gay 21

我不认为任何RESTful客户端会期望查看原因,以找出问题所在; 我见过/使用过的大多数RESTful服务都会在响应正文中发送标准状态信息和扩展消息.sendError(int, String)适合那种情况.

  • 有几个人认为我甚至不应该通过原因短语发送消息,我想我确信.但是,我不能使用sendError(int,String),因为容器会破坏消息.如果我调用sendError(400,"blah"),响应主体(至少在WebSphere中)是"Error 400:blah".不好,特别是如果你想返回XML或其他一些严格的格式.我将调用setStatus(int)并手动编写正文内容. (3认同)

ars*_*ars 19

如果您使用的是Tomcat,请参阅设置org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER:

http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html

  • 如果这是真的,将在HTTP标头中使用自定义HTTP状态消息.用户必须确保任何此类消息都是ISO-8859-1编码的,特别是如果消息中包含用户提供的输入,以防止可能的XSS漏洞.如果未指定,将使用默认值false.

有关原始漏洞的一些详细信息,请参阅此页面:

http://www.securityfocus.com/archive/1/archive/1/495021/100/0/threaded


laz*_*laz 12

澄清之后,我在Tomcat中尝试了这个.执行

response.sendError(HttpServletResponse.SC_BAD_REQUEST, "message goes here");
Run Code Online (Sandbox Code Playgroud)

回报

HTTP/1.1 400 message goes here
Run Code Online (Sandbox Code Playgroud)

作为回应的第一行.

您正在使用的servlet容器一定存在问题.