java - 为什么在使用 "response.flushBuffer()"提交响应后我仍然可以发送数据?

标签 java spring rest spring-mvc web

我使用以下 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/

相关文章:

Java:避免阶乘溢出

web-services - 所有的网络服务都是自动的restful 网络服务吗?

java - 找不到合适的 ServiceConnectorCreator 错误 - Spring cloud/CloudFoundry

ios - Swift 2 中的 Rest json POST 错误处理

java - 如何为我的jax-rs rest Web服务添加超时

java - 修复 GridBagLayout 中 JTextPane 的宽度

java - 有没有办法提取方法中使用的实例和静态变量,以了解需要模拟哪些对象

java - java.sql.Connection.close() 对 java.sql.Statement 对象等的影响

java - Spring WebClient 和 client_credentials 授予

java - 更改未生效 Rest Webservice