From:http://yulimeander.blog.sohu.com/119195170.html
ava.lang.IllegalStateException异常:简单分析和简单解决方案
2008-07-19 18:07
今天写java验证码程序,完成后使用一切正常,但是总抛出java.lang.IllegalStateException异常,虽然并不影响正常使用,但看了总让人觉得很不舒服,检查代码并没有错,最后上网查了不少资料,终于发现原因之所在。
我们在做文件上传或者下载,或者过滤等操作时,可能要用到页面的输出流.
例如在JSP使用:
response.reset();
response.setContentType(”application/vnd.ms-excel”);
OutputStream os = response.getOutputStream();  
抛出异常:
ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
从网上找了下资料,综合一下原因分析:
这是web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突.
即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的,在程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。
解决方案:
1.在程序中添加:
out.clear();
out = pageContext.pushBody();
就可以了;
2,不要在%][%之间写内容包括空格和换行符
3,在页面写入图片的时候,需要flush()
OutputStream output=response.getOutputStream();
output.flush();
4,在页面确定写入<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312”>
孙卫琴说可能是tomcat的bug,我给她回了封信:
:我看了看这里,http://www.javathinker.org/main.jsp?bc=showessay.jsp+filename=tomcat/tomcat_question_chapter13.htm这里是你回复别人的一个帖子,里面的观点基本上和我理解的一样,但是你最后写到可能是tomcat的bug,我想解释一下:在jsp中,out是内嵌对象,即已经设置了PrintWriter out=response.getWriter();这样在再次getOutputStream()得到输出流时(比如转发过滤、下载文件时)就出错了(写排斥锁),我不止一次看到有人的文件下载页面在后台不断打印这个异常。而在servlet中没有默认out内置对象,所以没有出错.你可以在servlet中添加out对象试试,应该会报异常的.所以正确的处理方式就应该是:在servlet中做控制层,在业务处理以前不要获得out对象,当业务操作失败或出现异常时再生成out对象回显操作结果。

***********************************************************
response.getOutputStream() 和 requonse.getWriter() 区别

(1)使用tomcat5容器调用response.getOutputStream()方法即可实现,但调用requonse.getWriter()方法时,输出二进制数据时(图片等内容无法显示)则出现“getWriter() has already been called for this response”异常。
(2)使用tomcat6容器调用response.getOutputStream()方法时有中文字符会发生“java.io.CharConversionException:Not an ISO 8859-1 character:”异常,调用requonse.getWriter()方法时可实现文本字符串数据输出,调用response.getOutputStream()方法可现实字节流数据的输出。
    就上述出现的问题进行分析研究,阅读了tomcat6的源代码发现,在调用response.getOutputStream()方法时会判断是否已调用了requonse.getWriter()方法;相反在调用requonse.getWriter()方法时会判断是否已调用了response.getOutputStream()方法。
    在tomcat5时并没有出现这个问题,使用response.getOutputStream()方法可现实两种数据输出,只是在使用requonse.getWriter()时发生异常,而在tomcat6下则必须针对不同的数据类型选择相应输出流,这时为什么呢?仔细阅读tomcat6源代码没有发现问题的根源,给出的参考时:在一次客户端请求的响应动作中,只能调用一种响应输出方法,要么是getWriter()要么是getOutputStream(),且如果使用getOutputStream()方法输出字符串格式的数据时,中文无法正常通过将发生“java.io.CharConversionException:Not an ISO 8859-1 character:”异常,在tomcat5下没有对getOutputStream()方法进行严格控制,中文字符串可正常通过。可见tomcat6的安全机制比tomcat5要严格,对于字符串格式的数据要求使用getWriter()方法输出响应,如果使用了getOutputStream()方法输出响应,则对输出的字符串数据进验证,要求高字节必须为0,显然中文是无法通过的。

转载于:https://blog.51cto.com/tianya23/1072702

Response.getWriter() 和Response.getOutputStream冲突相关推荐

  1. JSP的概念||原理||JSP的脚本||JSP的内置对象||response.getWriter()和out.write()的区别||案例:改造Cookie案例

    1. 概念 * Java Server Pages: java服务器端页面         * 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码         * ...

  2. response.getWriter().write()和 response.getWriter().print()的区别

    异步上传图片的代码.发现里面用了response.getWriter().print(),故联想到response.getWriter().writer(),经过一番api的查找与实操,总结如下: r ...

  3. response.getWriter().write 传递中文乱码

    在拦截器中用到了response.getWriter().write返回JSON数据 但传递中午是一直乱码 解决方案 最后在调用response.getWriter()之前添加这句话解决问题:  re ...

  4. [转]response.getWriter().write()与out.print()的区别

    原文地址:http://blog.csdn.net/javaloveiphone/article/details/8133772 1.首先介绍write()和print()方法的区别:   (1).w ...

  5. response.getWriter()和jsp中out对象的区别

    两者的主要区别:1.内置对象out的类型是JspWriter: response.getWrite()返回的类型是PrintWriter: out和response.getWriter的类不一样,一个 ...

  6. java response.write_@ResponseBody与response.getWriter .write()区别

    @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML 数据,需 ...

  7. response.getWriter().write()与out.print()的区别

    response.getWriter().write()与out.print()的区别 1.首先介绍write()和print()方法的区别:   (1).write():仅支持输出字符类型数据,字符 ...

  8. response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...

  9. response.getWriter()

    response.getWriter()的作用 PrintWriter out = response.getWriter(); getWriter()返回一个PrintWriter object 但是 ...

最新文章

  1. HDU6964 I love counting (字典树+莫队)
  2. 《黑客与画家》读后感
  3. redhat6.5 配置使用centos的yum源
  4. IplImage和Mat间的相互转换
  5. 工作组模式下SQL Server 2008 R2 数据库镜像
  6. 关闭TCP连接的学问
  7. java技术学习内容_Java开发主要都学些什么内容?
  8. java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...
  9. 互联网高并发之Hystrix实现服务隔离和降级
  10. ReentrantLock1.8源码
  11. Android网络库的比较:OkHTTP,Retrofit和Volley [关闭]
  12. html5做在线音乐,html5实现在线响应式音乐播放器
  13. c语言 牛逼代码,有c语言牛逼的神人吗
  14. vpp之feature机制介绍
  15. 干货:怎么提高科技成果转移转化成效?
  16. 阅读笔记——基于CART决策树的计算机网络课程学生成绩分析
  17. 苹果计算机没有根号,计算器根号,在iphone自带的计算器上怎样打出根号
  18. LabVIEW编程LabVIEW控制GPS例程与相关资料
  19. 母函数(指数型)(泰勒展开式)
  20. php扑克牌随机发,PHP实现随机发放扑克牌

热门文章

  1. 阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer
  2. ​Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
  3. 新一代算法模型:从搜索、推荐到广告!
  4. 数据分析索引总结(中)Pandas多级索引
  5. 谷歌大脑新研究:强化学习如何学会用声音来观察?
  6. 最喜欢随机森林?周志华团队 DF21 后,TensorFlow 开源决策森林库 TF-DF
  7. 推荐一位在BAT大厂工作的技术+美女双料博主
  8. 集成、知识蒸馏和自蒸馏有区别?
  9. 【GCN】图卷积网络 Graph Convolutional Networks
  10. selenium之作用和工作原理