response.reset();报错cannot-call-reset-after-response-has-been-committed

原因:

只有一个原因,你的response对象在执行response.reset()之前,就已经失效了!!!

问题分析:

网上看了一大堆答案,都是说response失效了,在我的业务代码中,怎么也找不到response在哪里失效,后来才发现,下载不可避免的生成这个对象:

ServletOutputStream outs = response.getOutputStream();

 这个对象是不需要关闭的!原来,在关闭ServletOutputStream 对象后,response也会随之失效!从而导致,你在后续的代码中,再去操作response,只有两种情况,要么报错,要么没效果!

解决方案(针对我的业务逻辑【文件下载】):

ServletOutputStream 对象的关闭代码,与后续操作response对象的代码保持同一层级即可!

如:

ServletOutputStream outs = response.getOutputStream();
try {
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    service.downExcel(outs);//业务代码
} catch (Exception e) {
    response.reset();//与outs.close();在同一层级
    response.setHeader("content-type", "text/html;charset=utf-8");
    try(
            OutputStreamWriter writer =newOutputStreamWriter(outs,StandardCharsets.UTF_8);
    ) {
        //组装JSON
        Map<String, Object> map=new HashedMap<>();
        map.put("retCode", "9999");
        map.put("retMsg", "Excel下载失败:"+e.getMessage());
        String json = new ObjectMapper().writeValueAsString(map);
        writer.write(json);
        writer.flush();
    } catch (Exception e1) {
        throw new PortalException("response.getOutputStream()语句异常",e1);
    }
}finally{
    //这里关闭流,与writer 对象保持同一级别,防止流关闭不去执行下载失败回调的代码
        outs.close();
}

 response.reset()就不会再报错,之后的代码也会正常执行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值