我可以在将数据提交到 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?

如何在将其提交到贝宝之前使用 php 数据验证贝宝表单

如何在将表单提交到服务器之前删除逗号分隔符?

如何在将 Blob 上传到 Blobstore 的 POST 请求中提交文本字段并在 Blob 的上传处理程序中检索它?

firebase 存储 - 使用 android 相机上传照片,但在将照片提交到 firebase 存储时崩溃

将我的应用提交到 App Store 进行审核后的清单