【问题标题】:Can I send error messages after committing data to HttpServletResponse我可以在将数据提交到 HttpServletResponse 后发送错误消息吗
【发布时间】:2017-03-31 04:30:35
【问题描述】:

每个人。

如果将部分数据提交到HttpServletResponse后发生错误, 我可以发送错误消息或替换 http 状态代码吗? 我调查了一些函数(sendError、sendStatus 等),但找不到解决方案。 这很正常,不是吗?

如果是这样,服务器需要在发送大量数据之前存储所有数据。 我认为服务器永远不会有足够的内存。

附言 我必须发送很多数据,例如视频数据。这么大的数据,所以我不想在发送之前存储很多数据。嗯:-(

【问题讨论】:

  • 你是对的。您必须在发送响应数据之前设置状态和标头。如果您正确地分离出您的关注点(例如,您可能会使用 MVC 模式),您将知道在开始发送任何响应之前是否需要通过 http 状态报告错误。
  • HTTP 状态码是最先发送的数据项之一。一旦发送,您将无法更改。
  • 也就是说,HttpServletResponse 缓冲了。但是,如果缓冲区溢出 - 服务器将开始发送数据。
  • 多年来,我一直使用“命令式”风格,基本上做同样的事情,计算一些东西,输出它们,再计算一些,输出。问题是如果您输出了一半的页面并出现错误,您将无法轻松更改响应。恕我直言,使用“函数式”样式通常更容易,其中整个响应被计算为 String 或 StringBuffer,然后该对象由您的主函数返回并一次全部输出。

标签: java http servlets response mime


【解决方案1】:

如果发生错误,您可以尝试增加缓冲区并重置它。这可以帮助您“修补”您的代码。但是对于视频内容,这可能会很困难。

您可以尝试以下代码。

小服务程序:

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);
        }
    }

}

或者像其他人建议的那样,将逻辑与视图分开。

至少你可以处理数据,写“日志”(作为响应的准备)。如果一切正常且未发生错误,请在响应中写入“日志”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2019-12-10
    • 2021-06-18
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多