Servlet error: Cannot call sendRedirect() after the response has been committed

Servlet error: Cannot call sendRedirect() after the response has been committed

我想在写入 excel 文件后重定向到一个页面。 servlet代码如下:

ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
        workbook.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
        response.setContentType("application/ms-excel");
        response.setContentLength(outArray.length);
        response.setHeader("Content-Disposition", "attachment; filename=name_"+date+".xlsx");
        response.setIntHeader("Refresh", 1);
        OutputStream outStream = response.getOutputStream();
        outStream.write(outArray);
        response.sendRedirect("url/reports.jsp");

此代码下载我创建的 Excel 文件。 当我调用上面的 servlet 时,正在下载 excel 文件,但它在最后一行抛出以下异常:

Servlet Error: ::java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

因此我无法重定向到新页面。在“outStream”

中写入输出后,我该怎么做才能访问响应对象

基本问题是这个...

I want to redirect to a page after writing the excel file.

...描述了两个单独的响应。服务器不能自己将它们链接在一起,因为客户端将只期望对每个请求有一个响应。因为需要两个请求来引发两个响应,所以此序列的自动化将需要客户端脚本。

就个人而言,我可能会将脚本放在前端:适当按钮上的处理程序或 link 首先下载文件,然后(成功时)发出对新页面的请求。也可以按照评论中的建议进行操作,但是:将脚本放在下载文件的新页面中。

您不能使用带有重定向的 body,因为浏览器在收到重定向时会向它找到的 URL 发出第二个请求(在 header 位置) ,并且显示的是第二个请求的响应,除非它也是重定向,在这种情况下,它将发出第三个请求,依此类推...