10

我正在创建一个简单的 Servlet 来回答表单提交。此 servlet 接收 POST 请求并应响应 Application/JSON 数据。这运作良好。我现在想为我的 servlet 添加错误管理:如果 servlet 接收到错误的请求参数,我希望它用一个简单的{"error":"ERROR MESSAGE"}JSON 响应来回答客户端一个 400 - “Bad Request” 响应。

我正在使用HttpServletResponse#sendError(int,String)来正确发送错误,但ContentType响应的 始终设置为text/html,即使我以前使用HttpServletResponse#setContentType("application/json")过。

这是使用 Servets 发送错误的好方法吗?我怎样才能强制ContentType响应application/json

我的测试 Servlet 的 doPost() 方法的示例代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("{\"error\":1}");
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
4

3 回答 3

29

我最近想在 JAX-RS 应用程序中发送错误消息时遇到了这个问题。sendError根据规范,总是会返回 text/html。鉴于以下情况,我必须执行以下操作HttpServletResponse response

response.resetBuffer();
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setHeader("Content-Type", "application/json");
response.getOutputStream().print("{\"errorMessage\":\"You can't use this!\"}");
response.flushBuffer(); // marks response as committed -- if we don't do this the request will go through normally!

flushBuffer与将响应标记为已提交一样,这一点至关重要sendError。起初我尝试只在输出流上调用 close,但会发生什么是我的过滤器将运行,然后 JAX-RS 资源将继续正常运行,然后我会收到错误消息和正常响应与 200 状态连接在一起代码!

resetBuffer是否有其他任何东西在此过滤器之前设置了标题或写入了一些内容。

于 2014-09-26T15:58:45.260 回答
5

按规定工作:

使用指定状态向客户端发送错误响应并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的 HTML 格式的服务器错误页面,将内容类型设置为“text/html”。

HttpServletResponse.sendError(int)

另一方面,没有此限制/功能。

使用指定的状态码并清除缓冲区向客户端发送错误响应。

这意味着:设置内容类型,写入缓冲区,调用sendError(400).

于 2013-01-22T13:07:09.673 回答
1

不要调用 response.sendError(int),而是使用 response.setStatus(int)。

于 2013-07-17T21:26:13.607 回答