我使用以下 REST 处理程序将文件传输到客户端。
我故意调用了response.flushBuffer()
,希望我应该被阻止写入响应,因为它已经提交。我希望客户不会收到完整的文件。
但整个文件仍会发送给客户端。并且不会抛出关于 Response Already Committed
的异常。
为什么?
我的代码:
@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "bootfile.efi", method = { RequestMethod.GET, RequestMethod.HEAD })
public void doHttpBoot(HttpServletResponse response) {
String filename = "/realbootfile.efi";
try {
ServletOutputStream output = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum);
datum = bufferedInput.read();
response.flushBuffer(); // <======= HERE
}
//output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最佳答案
响应 header 发送后即为“已提交”,这意味着无法接受对响应 header 的更改。它不会阻止您编写响应正文。
关于java - 为什么在使用 "response.flushBuffer()"提交响应后我仍然可以发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292303/