我可以在将数据提交到 HttpServletResponse 后发送错误消息吗
Posted
技术标签:
【中文标题】我可以在将数据提交到 HttpServletResponse 后发送错误消息吗【英文标题】:Can I send error messages after committing data to HttpServletResponse 【发布时间】:2017-03-31 04:30:35 【问题描述】:每个人。
如果将部分数据提交到HttpServletResponse后发生错误, 我可以发送错误消息或替换 http 状态代码吗? 我调查了一些函数(sendError、sendStatus 等),但找不到解决方案。 这很正常,不是吗?
如果是这样,服务器需要在发送大量数据之前存储所有数据。 我认为服务器永远不会有足够的内存。
附言 我必须发送很多数据,例如视频数据。这么大的数据,所以我不想在发送之前存储很多数据。嗯:-(
【问题讨论】:
你是对的。您必须在发送响应数据之前设置状态和标头。如果您正确地分离出您的关注点(例如,您可能会使用 MVC 模式),您将知道在开始发送任何响应之前是否需要通过 http 状态报告错误。 HTTP 状态码是最先发送的数据项之一。一旦发送,您将无法更改。 也就是说,HttpServletResponse
被缓冲了。但是,如果缓冲区溢出 - 服务器将开始发送数据。
多年来,我一直使用“命令式”风格,基本上做同样的事情,计算一些东西,输出它们,再计算一些,输出。问题是如果您输出了一半的页面并出现错误,您将无法轻松更改响应。恕我直言,使用“函数式”样式通常更容易,其中整个响应被计算为 String 或 StringBuffer,然后该对象由您的主函数返回并一次全部输出。
【参考方案1】:
如果发生错误,您可以尝试增加缓冲区并重置它。这可以帮助您“修补”您的代码。但是对于视频内容,这可能会很困难。
您可以尝试以下代码。
http://localhost:8080/BufferedResponse?flash http://localhost:8080/BufferedResponse小服务程序:
package testingThings;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BufferedResponse")
public class BufferedResponse extends HttpServlet
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
response.getWriter().println("buffer size: " + response.getBufferSize());
response.setStatus(HttpServletResponse.SC_OK);
String flash = request.getParameter("flash");
if (flash != null)
response.flushBuffer();
if (response.isCommitted())
response.getWriter().println("buffer was commited.");
response.getWriter().println("it is too late change the response");
else
response.resetBuffer();
response.getWriter().println("buffer reseted.");
response.getWriter().println("response and status code were changed");
response.setStatus(HttpServletResponse.SC_FOUND);
或者像其他人建议的那样,将逻辑与视图分开。
至少你可以处理数据,写“日志”(作为响应的准备)。如果一切正常且未发生错误,请在响应中写入“日志”。
【讨论】:
以上是关于我可以在将数据提交到 HttpServletResponse 后发送错误消息吗的主要内容,如果未能解决你的问题,请参考以下文章
如何在将应用程序提交到 App Store 时修复错误 ITMS 90032、90022、90363、90394?
如何在将 Blob 上传到 Blobstore 的 POST 请求中提交文本字段并在 Blob 的上传处理程序中检索它?