【问题标题】: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);