原因:
只有一个原因,你的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()就不会再报错,之后的代码也会正常执行!