gpt4 book ai didi

servlets - HttpServletResponse#sendError 如何更改 ContentType

转载 作者:搜寻专家 更新时间:2023-10-31 08:12:20 25 4
gpt4 key购买 nike

我正在创建一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com