【问题标题】:Sending an error response after servlet response has been written to在写入 servlet 响应后发送错误响应
【发布时间】:2012-01-23 18:16:23
【问题描述】:

我正在使用 servlet 编写数据传输应用程序,如果在写入 servlet 响应后出现问题,我希望能够发送错误响应。这可能吗?

我的问题是我将发送从数据库读取的数据创建的大型压缩 csv 文件。一切都是通过流完成的,因此在写入 servlet 响应后创建 csv 文件时可能会发生错误。我已经看到它发生了。

我注意到这只是在刷新 servlet OutputStream 后出现的问题。如果它没有被刷新,我可以发送一个错误响应,但不能在之后。由于我正在处理大量数据,因此一次性发送所有内容是不可行的。

【问题讨论】:

    标签: java servlets response


    【解决方案1】:

    我正在使用 servlet 编写数据传输应用程序,如果在写入 servlet 响应后出现问题,我希望能够发送错误响应。这可能吗?

    不是从服务器端开始。服务器无法从客户端取回已经刷新的字节。这是一个不归路。我认为这与响应的Writer 或OutputStream 上的IOException 不同。

    如果它是 HTML(即使这是一种不好的做法;HTML 属于 JSP),您可以打印一些 JS 代码来强制更改位置,如下所示:

    try {
        writer.write(someHtml);
    } catch (SomeException e) {
        writer.write("<script>window.location = 'error.jsp';</script>");
        // ...
    }
    

    但这在非 HTML 响应中是不可能的。您确实需要事先在内存或(临时)磁盘上缓冲整个响应。如果缓冲完美无缺,那么您可以再次将其通过管道传递给响应。

    try {
        processAndSaveInMemoryOrTempDiskFile(someData, byteArrayOrFileLocation);
    } catch (SomeException e) {
        throw new ServletException(e, "Processing some data failed.");
    }
    
    copyFromMemoryOrTempDiskToResponse(byteArrayOrFileLocation, writer);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2018-02-07
      • 2020-03-06
      • 1970-01-01
      相关资源
      最近更新 更多