servlets - HttpServletResponse#sendError 如何更改 ContentType

标签 servlets content-type http-error

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

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

这是使用 Servets 发送错误的好方法吗?如何强制 ContentTypeapplication/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);
}

最佳答案

我最近在想在 JAX-RS 应用程序内部发送错误消息时遇到了这个问题。根据规范,sendError 将始终返回 text/html。鉴于 HttpServletResponse 响应,我必须执行以下操作:

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 是为了防止其他任何东西在此过滤器之前设置 header 或写入一些内容。

关于servlets - HttpServletResponse#sendError 如何更改 ContentType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14459045/

相关文章:

java - 仅上传图像名称以及数据库中的一些数据,并且仅图像应存储在网页内容的文件夹中

java - CGI 和 Servlet 的执行方式有何不同?

java - 将文件路径字符串从 jsp 传递到 java servlet

servlets - 如何在 WAR 中使用注释定义 servlet 过滤器的执行顺序

sharepoint - 如何创建一个以 Doc Lib 为目标并使用文档的 'Name' 的查找列?

asp.net - httpErrors 配置部分在 Windows Azure 中不起作用

json - 如何在Dart Server中设置request.response的内容类型?

angularjs - 使用 Angular 下载 PDF

http - 可以 gzip 压缩对 http 请求错误的响应吗?

java - HTTP 状态 500 - 内部服务器错误 eclipse