5

dev_appserver我发现 Java和实时 App Engine 服务器之间存在不一致。

在我的本地开发服务器上,我有一个 Servlet,它返回:

return response.sendError(response.SC_BAD_REQUEST, "Please log in to comment");

当我访问该页面时,我会在标题中返回一条状态代码消息:

Status Code:400 Please log in to comment

当我将它部署到 App Engine 时,问题就出现了。访问同一个 servlet 时,我收到此“错误请求”而不是“请登录以发表评论”:

Status Code:400 Bad Request

状态代码消息出现Please log in to comment在内容 HTML 中,但不像在开发环境中那样出现在标题中。

为什么是这样?

编辑

这是curl -vvvvdev_appserver 和生产的跟踪:

dev_appserver 卷曲跟踪:

> POST /add-comment HTTP/1.1
> User-Agent: Mozilla/4.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 9
> Content-Type: application/x-www-form-urlencoded
>         
< HTTP/1.1 400 Please log in to comment
< Content-Type: text/html; charset=iso-8859-1
< Cache-Control: must-revalidate,no-cache,no-store
< Content-Length: 1406
< Server: Jetty(6.1.x)

生产卷曲痕迹:

> POST /add-comment HTTP/1.1
> User-Agent: Mozilla/4.0
> Host: www.xxx.org
> Accept: */*
> Content-Length: 9
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 400 Bad Request
< Content-Type: text/html; charset=utf-8
< Vary: Accept-Encoding
< Date: Thu, 18 Aug 2011 14:04:26 GMT
< Server: Google Frontend
< Cache-Control: private
< Transfer-Encoding: chunked
4

2 回答 2

4

我会说 prod 系统是正确的实现。javadocssendError()说:

使用指定状态向客户端发送错误响应。服务器默认创建响应,使其看起来像包含指定消息的 HTML 格式的服务器错误页面,将内容类型设置为“text/html”,不修改 cookie 和其他标头。如果已经为与传入的状态代码对应的 Web 应用程序进行了错误页面声明,则它将优先于建议的 msg 参数返回。

如果响应已提交,则此方法将引发 IllegalStateException。使用此方法后,应将响应视为已提交,不应写入。

我强调了一部分。这表示它只在可能的情况下返回带有消息的 html 页面。它并没有说它在 HTTP 状态代码中使用它(我个人也没有在任何地方看到它:()

于 2011-08-18T14:14:56.700 回答
1

这不是具体的问题sendError。该setStatus方法的行为方式相同。在普通 Java 下,两者sendErrorsetStatus设置状态描述。问题是生产 App Engine 服务器总是将状态描述设置为每个代码的标准描述。

于 2012-08-14T00:40:07.660 回答