公司一个老项目,这两天爆出了一个问题。异常都是
java.lang.IllegalStateException: getOutputStream()
has already been called for this response
这个项目的内容,就是通过页面下载一个word文件,当然这个word文件是根据用户的选择动态生成的。
当时实现这个功能的人,没有用servlet 来实现这个功能,而是选择了使用 jsp, 然后在 jsp 当中调用了
一个自己做的 taglib,然后在 doStartTag 方法当中,将 word 内容往 OutputStream 里面写。
这个功能,以往都没发现什么大问题,但是最近有两个word文件下载不下来,一下载就说 连接被服务器重置了。
查异常就是上面提到的 IllegalStateException。
先搜了一下,果然是个比较常见的问题,google上一搜一大堆。
基本上都是说,在jsp里面,自己往 OutputStream 里面写东西,就容易产生这样的冲突。因为在jsp所生成
的对应的java文件中,可以很清楚的看到
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这个 releasePageContext 会去获取 writer,而这个时候 getOutputStream已经被调用了,就会出这个错误。
解决的方法有两种,一种是比较强的,直接 _jspxFactory = null; 另外一种比较委婉,
out.clear();pageContext.pushBody();
这两种方式,对于直接在 jsp里面往 OutputStream 写东西的情况,例如产生校验码的图片,是没有问题的。
但是,对于我这种在jsp里面调用了 tag 再写OutputStream的情况无效。
开始折腾jsp文件,把 out 又是clear又是clearBuffer,都没啥效果,于是冷静下来想这个问题。
因为不是每个文件都出错,而且呢,使用 out.clear();pageContext.pushBody();方法后,后台
没有异常了,但是还是一样的报告服务器重置了连接。也就是说,在jsp报告那个错误之前,实际上
已经出问题了。
这时候,注意到服务器没有告知浏览器word文件的长度,有可能是在某个word当中,出现了特殊的
字符,例如 \0 这样的东西,由于没有长度,浏览器认为已经下载完成了,于是连接就被中断了。所以,
我判断这个错误的原因,应该是由于没有设置长度所造成的。
接下来就简单了,把word文件写到一个临时文件当中,然后取得长度,在response当中设置文件长度,
一切就OK了。
结论:尽信google,不如无google。如果不是一开始走向了歧途,说不定能够较早的定位到问题。
分享到:
相关推荐
### IllegalStateException的解决策略 **一、对象状态检查** `IllegalStateException`(非法状态异常)是一种运行时异常,在Java开发中经常遇到。当操作一个对象的状态不符合要求时,例如调用一个对象的方法,但是...
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
解决办法是修改 WebLogic 的虚拟内存调大,设置 PermSize 和 MaxPermSize 的值为 256 和 512。 二、OutOfMemoryError 问题 在文件上传时,因为我们的工程较大,导致虚拟交换内存不足引起的 OutOfMemoryError 问题...
Java注解@Transactional事务类内调用不生效问题及解决办法 Java注解@Transactional是Java中的一种注解,主要用于标记事务边界。然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用...
下面就将该问题的最终解决办法介绍如下。 问题概要: 在struts2中使用result里type="stream"的结果类型时,可以实现文件的下载管理,使用时也是比较顺畅,但是当在“下载提示窗口”中点击“取消按钮”时,总是报...
Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323)...
解决办法是从Spring提供的lib目录中获取这两个jar的兼容版本。 2. **HQL查询错误**: 当你遇到`java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode`时,可能是你在...
解决办法: * IE 安全设置导致的,最简单的办法:Internet 选项--安全 下所有的区域的安全级别都关闭。 7. 如果 IE 浏览器回放时操作速度非常慢 解决办法: * 可能是 64 位的驱动,换成 32 位驱动(亲测有效)。...
解决办法包括恢复备份数据,或者检查存储机制的稳定性和正确性。 5. **IllegalStateException: Session已失效**:当尝试访问一个已经失效的HttpSession时,会抛出此异常。确保在适当的时候关闭或重新创建Session,...
解决办法是在进行任何输出之前先检查是否需要重定向。 #### 二、`response.setHeader("Location", "")` **概述:** 另一种实现重定向的方法是通过设置HTTP响应头中的`Location`字段来实现,这通常被称为服务器端...
- **Eclipse 插件 Maven 在使用 add dependency 时找不到包,解决办法**:这里提供了在 Eclipse 中使用 Maven 插件添加依赖时遇到问题的解决方法。 - **获取指定个数指定范围的随机数**:这部分介绍了如何在 Java 中...
4. **解决办法** - **方法一:异步处理** - 使用`SwingUtilities.invokeLater()`或`invokeAndWait()`将UI更新操作包装在一个新的Runnble中,并放入EDT队列。这样可以确保更新操作在EDT上下文中执行,而不会阻塞其他...
解决办法是在onDestroy()方法中确保Dialog被关闭,并检查非主线程中是否存在修改UI的操作,因为这些操作必须在主线程中进行。 对于ProgressDialog的定制,可以通过setIndeterminateDrawable()方法替换旋转的图片。...
以下是一些Java中常见的异常及其解决办法: 1. **Caused by: line 1:188: expecting CLOSE, found 'null'** 这个错误通常表示解析错误,可能是因为在XML或HQL(Hibernate查询语言)中遗漏了关闭的括号或其他语法...
throw new IllegalStateException("No head node found"); } public static void main(String[] args) { // 假设我们已经有了节点列表 Map, Node> nodesById = new HashMap(); // 添加节点到nodesById... ...
这个解决方案假设输入的节点集合是完整的,即每个nextId都能在节点集合中找到对应的节点。如果存在无效的nextId,我们需要添加额外的错误检查或处理逻辑。 在实际应用中,这个链表的构建方式可能不太常见,但在某些...
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java....
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....